L'architettura di un framework web plasma profondamente il modo in cui gli sviluppatori organizzano il codice, scalano le applicazioni e mantengono i progetti nel tempo. Con l'arrivo di Laravel 12, il team di Taylor Otwell ha introdotto una revisione radicale della struttura predefinita dell'applicazione, puntando su un bootstrap minimale e una gerarchia di directory più piatta e intuitiva. Questa guida esamina in dettaglio le modifiche apportate, confrontandole con Laravel 10 e 11, e spiega come adattare il proprio flusso di lavoro per sfruttare appieno la nuova architettura. Che tu stia aggiornando un progetto esistente o iniziando da zero, comprendere queste trasformazioni è essenziale per rimanere all'avanguardia nell'ecosistema Laravel.
Panoramica della Nuova Architettura di Laravel 12
Laravel 12 abbandona la tradizionale separazione in app/Http, app/Models, app/Providers a favore di una struttura completamente appiattita. La directory app ora contiene solo i sottoinsiemi necessari: Controllers, Models, Middleware, Providers (un unico AppServiceProvider ridotto all'osso) e la nuova cartella Actions per incapsulare la logica di business. Il famigerato app/Exceptions/Handler scompare, integrato direttamente nel kernel dell'applicazione. Anche il file routes/web.php viene semplificato, con la rimozione del provider RouteServiceProvider e l'adozione di un caricamento automatico delle rotte basato su convenzioni.
La Struttura della Directory 'app'
Nel bootstrap minimale di Laravel 12, la directory app si presenta così:
app/
├── Actions/
├── Controllers/
├── Middleware/
├── Models/
├── Providers/
│ └── AppServiceProvider.php
└── enums/
Non esiste più app/Http. I controller risiedono direttamente in app/Controllers (con namespace App\Controllers anziché App\Http\Controllers). I model restano in app/Models. I middleware vengono raggruppati in app/Middleware e registrati automaticamente tramite attributi. Il file AppServiceProvider ora contiene solo il metodo boot con le configurazioni minime essenziali; tutto il resto è delegato a provider specifici generati con artisan make:provider.
Bootstrap Minimale: il Nuovo 'bootstrap/app.php'
Il file bootstrap/app.php è stato drasticamente ridotto. In Laravel 10 e 11 conteneva la creazione dell'istanza dell'applicazione, la registrazione dei service provider di default e la configurazione del middleware globale. In Laravel 12, tutto ciò viene risolto in poche righe grazie all'auto-discovery:
<?php
use Illuminate\Foundation\Application;
return Application::configure()
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function ($middleware) {
// Middleware personalizzati o di gruppo
})
->withExceptions(function ($exceptions) {
// Gestione personalizzata delle eccezioni
})
->create();
Non c'è più app/Exceptions/Handler: le eccezioni vengono gestite direttamente nella closure withExceptions. Analogamente, il middleware globale viene registrato via withMiddleware. Questo approccio riduce il numero di file da creare e manutenere, spostando la configurazione nel punto di ingresso dell'applicazione.
Differenze Rispetto a Laravel 10 e 11
Da Laravel 10 a Laravel 12
Laravel 10 utilizzava ancora la struttura classica con app/Http/Controllers, app/Http/Middleware, app/Providers e app/Exceptions/Handler. Il passaggio a Laravel 12 richiede una ristrutturazione significativa delle directory e dei namespace. I controller devono essere spostati da App\Http\Controllers a App\Controllers e i namespace aggiornati in tutti i file che li referenziano. Il file bootstrap/app.php va riscritto seguendo il nuovo pattern. Inoltre, il RouteServiceProvider non esiste più: la registrazione delle rotte avviene direttamente in bootstrap/app.php o tramite il provider standard App\Providers\RouteServiceProvider (mantenuto per retrocompatibilità ma sconsigliato).
Da Laravel 11 a Laravel 12
Laravel 11 aveva già compiuto un passo verso la semplificazione, eliminando alcuni file boilerplate (come Kernel.php e Exceptions/Handler). Tuttavia, manteneva ancora la directory app/Http e il RouteServiceProvider di default. Con Laravel 12, la directory app/Http scompare completamente. I middleware vengono ora definiti tramite attributi PHP, come #[Middleware('auth')] nei controller, oppure registrati globalmente in bootstrap/app.php. Anche il vecchio sistema di alias di middleware è stato sostituito da attributi o da un nuovo metodo alias nella closure withMiddleware.
Tabella Comparativa delle Directory Principali
Laravel 10 Laravel 11 Laravel 12
app/ app/ app/
├── Console/ ├── Console/ ├── Actions/
├── Exceptions/ ├── Exceptions/ ├── Controllers/
├── Http/ ├── Http/ ├── Middleware/
│ ├── Controllers/ │ ├── Controllers/ ├── Models/
│ ├── Middleware/ │ ├── Middleware/ ├── Providers/
│ └── Requests/ │ └── Requests/ └── enums/
├── Models/ ├── Models/
├── Providers/ └── Providers/
└── Providers/
Impatto sullo Sviluppo Quotidiano
La nuova struttura riduce il cognitive load per gli sviluppatori che iniziano un progetto Laravel. Non è più necessario chiedersi dove posizionare un controller o un middleware: la risposta è direttamente nelle rispettive cartelle sotto app. Inoltre, l'uso degli attributi per la registrazione del middleware rende il codice più dichiarativo e facilmente testabile. Il bootstrap minimale si traduce in un avvio dell'applicazione più rapido, poiché meno file vengono caricati automaticamente. Anche la gestione delle eccezioni diventa più snella: invece di creare un'intera classe Handler, basta una closure in bootstrap/app.php.
Per chi proviene da Laravel 10, l'aggiornamento richiede attenzione ai dettagli. È consigliabile utilizzare lo strumento laravel/upgrade per automatizzare la migrazione dei namespace e delle directory. Per chi già usa Laravel 11, il passaggio è meno traumatico: la maggior parte del codice rimane valida, con solo l'eliminazione della directory app/Http e l'aggiornamento del file bootstrap/app.php.
Best Practices per Adottare la Nuova Struttura
- Riorganizzare i namespace: aggiorna tutti i riferimenti da
App\Http\ControllersaApp\Controllerse così via. - Sfruttare gli attributi PHP: usa
#[Middleware]e#[Route]per rendere il codice più esplicito. - Centralizzare la configurazione: mantieni le closure in
bootstrap/app.phpper middleware ed eccezioni, evitando file separati inutili. - Limitare i service provider: non creare provider superflui; usa
AppServiceProvidersolo per bindings essenziali.
Conclusione Pratica
Laravel 12 segna un punto di svolta nella filosofia di design del framework: meno boilerplate, più chiarezza. La nuova struttura dell'applicazione e il bootstrap minimale non solo semplificano la vita agli sviluppatori, ma rendono anche i progetti più facili da comprendere per i nuovi arrivati. Se stai avviando un nuovo progetto, inizia direttamente con Laravel 12 e abbraccia la struttura appiattita. Se aggiorni un progetto esistente, pianifica la migrazione con attenzione, utilizzando gli strumenti ufficiali e testando ogni modifica. Per approfondire l'intero ecosistema Laravel 11 e 12, consulta la nostra guida definitiva all'architettura Eloquent ORM e Livewire 3. Inoltre, tieni d'occhio le ultime novità di PHP, come le property hooks e typed class constants, che si integrano perfettamente con Laravel 12.
Sponsored Protocol