Categoria

Pagina 3 di 4

Laravel: il framework PHP che scelgo per i progetti che devono durare

Laravel è oggi il framework PHP più serio per costruire applicazioni aziendali, e la ragione non è la moda: è la maturità ingegneristica del suo ecosistema. Lo uso dalle prime versioni 5.x fino alla 12 su gestionali, piattaforme SaaS, e-commerce e sistemi B2B che devono restare in produzione per anni, non per una stagione. Quello che porto in questa categoria non è l'entusiasmo per l'ultima feature, ma il criterio con cui si decide che cosa adottare e che cosa lasciar perdere.

Il primo pilastro è l'architettura. Un progetto Laravel invecchia bene solo se la logica di business è separata dall'infrastruttura, se i controller restano magri e la complessità vive in un service layer testabile: è qui che si gioca la differenza fra un'applicazione che si estende senza paura e una che a ogni modifica rischia la regressione. Scrivo di service layer e principi SOLID, di quando un pattern come l'event-driven o il repository aggiunge valore reale e quando è solo cerimonia, e di quel confine, spesso frainteso, oltre il quale spezzare un monolite in microservizi diventa un costo travestito da modernità.

Il secondo pilastro è la vita dell'applicazione in produzione: le prestazioni sotto carico vero, dove il collo di bottiglia è quasi sempre l'accesso ai dati e non il codice PHP; il lavoro asincrono con code e worker, che diventa indispensabile appena un'operazione non può più bloccare la richiesta dell'utente; e la sicurezza, che in Laravel non è un modulo da aggiungere alla fine ma una postura da tenere dal primo commit, dalla gestione dei segreti all'hardening secondo criteri verificabili.

Il terzo pilastro è il tempo: come si accompagna una codebase attraverso le versioni major senza fermare il business, come si subentra su un progetto ereditato e senza documentazione, come si moderniza una base datata senza riscriverla da zero. È il lavoro meno appariscente e più prezioso, quello che protegge un'azienda dal debito tecnico che si accumula in silenzio. Sullo sfondo, il capitolo che si sta aprendo ora: Laravel che diventa AI-native, e il modo corretto di orchestrare i modelli senza cedere loro il controllo del dominio.

Se hai un progetto Laravel da far scalare o una base da modernizzare, vedi i miei progetti PHP senior o parliamone nella consulenza IT e DevOps.

Laravel ben scritto è codice che altri possono leggere, estendere e manutenere senza chiamarti nel weekend. È questo il vero valore.

Controller base Laravel 12: da AuthorizesRequests e ValidatesRequests impliciti a Form Request, Gate e composizione esplicita

Controller base Laravel 12: da AuthorizesRequests e ValidatesRequests impliciti a Form Request, Gate e composizione esplicita Il PR #6188 "Slim skeleton" di Taylor Otwell ha rimosso AuthorizesRequests e ValidatesRequests dal Controller base di Laravel 11. La motivazione: "$this->validate has not been documented in some time. $this->authorize can simply be Gate::authorize." Le Form Request (introdotte in Laravel 5.0, febbraio 2015) e il facade Gate sostituiscono i trait impliciti con composizione esplicita - il principio "favor composition over inheritance" del Gang of Four applicato al framework. Continua a leggere
Ultima modifica:

Health check applicativi Laravel 12: da controller custom a Health Routing con DiagnosingHealth e spatie/laravel-health

Health check applicativi Laravel 12: da controller custom a Health Routing con DiagnosingHealth e spatie/laravel-health L'Health Routing di Laravel, introdotto in Laravel 11 (PR #47309), espone un endpoint /up che dispatcha l'evento DiagnosingHealth - i listener che lanciano eccezioni causano HTTP 500, altrimenti HTTP 200. È un check pass/fail per load balancer e Kubernetes probes. Per monitoring dettagliato con dashboard e notifiche, spatie/laravel-health (10M+ install) offre 16+ check integrati. AWS Builders' Library documenta il trade-off tra shallow e deep health check. Continua a leggere
Ultima modifica:

L'helper once() in Laravel 12: memoizzazione per-request con WeakMap al posto di proprietà statiche e cache forzata

L'helper once() in Laravel 12: memoizzazione per-request con WeakMap al posto di proprietà statiche e cache forzata L'helper once(), introdotto in Laravel 11 (PR #49744, Nuno Maduro), usa internamente una WeakMap di PHP 8.0 per cachare il risultato di una closure per la durata della request. In metodi d'istanza la cache è per-oggetto, in metodi statici è per-classe, in contesto globale è per call-site. In Octane, FlushOnce esegue Once::flush() tra le request. Continua a leggere
Ultima modifica:

Sicurezza upload immagini in Laravel 12: perché la regola image esclude gli SVG e come validare i file in modo sicuro

Sicurezza upload immagini in Laravel 12: perché la regola image esclude gli SVG e come validare i file in modo sicuro La PR #54331 di Laravel 12 (gennaio 2025) ha escluso gli SVG dalla regola image di default - un breaking change giustificato dal fatto che oltre 500 repository pubblici usavano image senza escludere SVG. Un file SVG è XML e può contenere tag script, event handler inline e foreignObject con HTML arbitrario. La validazione MIME non rileva questi payload. Continua a leggere
Ultima modifica:

Event discovery in Laravel 12: da EventServiceProvider a auto-discovery per listener disaccoppiati e testabili

Event discovery in Laravel 12: da EventServiceProvider a auto-discovery per listener disaccoppiati e testabili L'event discovery scansiona automaticamente i listener nella directory app/Listeners e li registra in base al type-hint del metodo handle(). Introdotto in Laravel 5.8.9 come opt-in, è diventato il default da Laravel 11 con la rimozione dell'EventServiceProvider dallo skeleton. Il risultato: zero configurazione manuale, listener auto-registranti e testabili con Event::fake(). Continua a leggere
Ultima modifica:

Strategy pattern in Laravel: selezione dinamica di implementazioni con Service Container, contextual binding e Pennant

Strategy pattern in Laravel: selezione dinamica di implementazioni con Service Container, contextual binding e Pennant Lo Strategy pattern - un behavioral pattern del Gang of Four - in Laravel si implementa con il Service Container: bind() per il default, when()->needs()->give() per eccezioni contestuali, e Feature::active() di Pennant per switching runtime basato su feature flag. Nessuna factory custom necessaria. Continua a leggere
Ultima modifica:

Validazione in Laravel 12: da closure inline a Rule Objects con ValidationRule per regole testabili, riutilizzabili e type-safe

Validazione in Laravel 12: da closure inline a Rule Objects con ValidationRule per regole testabili, riutilizzabili e type-safe L'interfaccia ValidationRule, introdotta in Laravel 10, ha sostituito la vecchia Rule con passes()/message() e InvokableRule, entrambe deprecate. Un unico metodo validate() con closure $fail permette regole testabili in isolamento, parametrizzabili via costruttore, e riutilizzabili su più Form Request senza duplicazione. Continua a leggere
Ultima modifica:

Concurrency::run() in Laravel: esecuzione parallela di task I/O-bound senza code, worker o estensioni pcntl

Concurrency::run() in Laravel: esecuzione parallela di task I/O-bound senza code, worker o estensioni pcntl Concurrency::run() è stato introdotto in Laravel 11.23 e stabilizzato in Laravel 12. Il driver process (default) serializza le closure, le esegue in processi PHP figli separati via Artisan, e restituisce i risultati al processo padre. Non usa fibers né thread - ogni task ha il proprio bootstrap completo dell'applicazione. Continua a leggere
Ultima modifica:

Testing dei job in coda Laravel: da Queue::fake() a withFakeQueueInteractions() per validare retry, release e failure senza broker

Testing dei job in coda Laravel: da Queue::fake() a withFakeQueueInteractions() per validare retry, release e failure senza broker Queue::fake() verifica che un job venga dispatchato correttamente, ma non testa cosa succede dentro handle() quando il job deve rilasciarsi, cancellarsi o fallire. withFakeQueueInteractions(), introdotto in Laravel 11, permette di chiamare handle() in isolamento e asserire su release(), delete() e fail() senza un broker reale. Continua a leggere
Ultima modifica:

Refactoring delle integrazioni API esterne in Laravel: da chiamate Guzzle sparse a HTTP Client con Macro e testing deterministico

Refactoring delle integrazioni API esterne in Laravel: da chiamate Guzzle sparse a HTTP Client con Macro e testing deterministico L'HTTP Client di Laravel wrappa Guzzle aggiungendo macro riutilizzabili, retry con backoff esponenziale e Http::fake() per testing deterministico. In un applicativo con 12 integrazioni esterne, il refactoring da chiamate Guzzle sparse a service class con macro ha eliminato 400 righe di codice duplicato e reso testabili integrazioni che prima non lo erano. Continua a leggere
Ultima modifica:

Strumenti per chi sviluppa in Laravel

Piccoli tool che tornano comodi nel lavoro quotidiano:

Audit del composer.lock, Regex tester, Generatore UUID, Interprete di espressioni cron.