Cos’è un controller
Anziché definire tutta la logica delle richieste come closure nei file di route, puoi organizzarla usando classi “controller”. I controller raccolgono in un’unica classe la logica di gestione delle richieste correlate. Ad esempio, la classeUserController può gestire tutte le richieste in ingresso relative agli utenti: visualizzazione, creazione, aggiornamento, eliminazione.
Di default i controller si trovano nella directory app/Http/Controllers.
Creazione di un controller
Per generare rapidamente un nuovo controller usa il comando Artisanmake:controller.
Tutti i controller dell’applicazione sono di default nella directory app/Http/Controllers.
Controller di base
Una classe controller può avere alcuni metodi public che rispondono alle richieste HTTP.show di App\Http\Controllers\UserController e i parametri di route vengono passati al metodo.
I controller non devono necessariamente estendere una classe base. È però comodo estendere un controller base per condividere metodi tra tutti i controller.
Controller a singola action
Se un’azione del controller è particolarmente complessa, può essere comodo dedicare l’intera classe a quella singola azione. Per farlo definisci un unico metodo__invoke.
--invokable del comando make:controller.
Resource controller
Se pensi a ciascun modello Eloquent come a una “risorsa”, di norma applichi lo stesso insieme di operazioni (CRUD) a ciascuna risorsa. Il resource routing di Laravel assegna con una sola riga di codice a un controller le route CRUD tipiche. Con l’opzione--resource di make:controller generi rapidamente un controller che gestisce queste azioni.
app/Http/Controllers/PhotoController.php con gli scaffold di tutte le operazioni di risorsa.
Poi registra la route di risorsa che punta al controller.
| Metodo HTTP | URI | Azione | Nome route |
|---|---|---|---|
| GET | /photos | index | photos.index |
| GET | /photos/create | create | photos.create |
| POST | /photos | store | photos.store |
| GET | /photos/{photo} | show | photos.show |
| GET | /photos/{photo}/edit | edit | photos.edit |
| PUT/PATCH | /photos/{photo} | update | photos.update |
| DELETE | /photos/{photo} | destroy | photos.destroy |
Con il comando
php artisan route:list puoi ottenere una panoramica veloce delle route dell’applicazione.Route di risorsa parziali
Quando dichiari le route di risorsa puoi indicare un sottoinsieme di azioni.Route di risorsa API
Quando dichiari route di risorsa da usare in un’API, spesso vuoi escludere le route che restituiscono template HTML comecreate ed edit.
Con il metodo apiResource queste due route vengono escluse automaticamente.
Dependency injection
Constructor injection
Il service container di Laravel viene usato per risolvere le dipendenze di tutti i controller Laravel. Perciò puoi indicare con il type hint nel costruttore del controller le dipendenze necessarie. Le dipendenze dichiarate vengono risolte automaticamente e iniettate nell’istanza del controller.Method injection
Oltre al constructor injection, puoi indicare con il type hint le dipendenze di un metodo. Un caso d’uso comune è iniettare un’istanzaIlluminate\Http\Request in un metodo del controller.
Illuminate\Http\Request e accedere al parametro id.
Prossimi passi
Routing
Rivedi come definire le route e integrarle con i controller.