In alcuni contesti, come per esempio quello delle API RESTful, potrebbe essere utile unire insieme la “risorsa” presente sul database (intesa come riga di dati salvati) con la “risorsa” intesa come documento sul web accessibile tramite URI (che, per l’appunto, è l’acronimo di Uniform Resource Identifier).
In questo modo è possibile creare un legame 1:1 tra l’istanza di un model e la risorsa esposta esternamente tramite richieste HTTP. Le URI diventano, quindi, il punto di accesso al database, rendendo possibile effettuare operazioni CRUD (Create, Retrieve, Update, Delete) attraverso richieste HTTP. In pratica, si definisce una convenzione che associa la richiesta HTTP all’azione da compiere su una certa entità (cfr la tabella dei nomi di metodi suggeriti).
Se, poi, la nostra applicazione gestisce e salva sul database diversi model/risorse (per esempio Book, Movie e MusicAlbum), potrebbe essere pratico e lungimirante gestire l’accesso a queste risorse in un modo coerente.
Laravel offre una gestione dedicata per questo scenario tipico di sviluppo, offrendo delle rotte e dei controller definiti resource.
Creazione di un controller resource in Laravel
È possibile creare un controller resource in Laravel fornendo l’opzione –resource al comando Artisan make:controller.
php artisan make:controller BookController –resource
Il controller così creato conterrà già la firma di tutti i metodi convenzionali necessari per connettere il controller a una serie di rotte prestabilite.
Abbiamo già elencato alcuni di questi metodi nel capitolo dedicato ai controller.
namespace App\Http\Controllers; class BookController extends Controller { /** * Mostra l'elenco delle risorse Book presenti nel database */ public function index() { // } /** * Mostra il form per creare una nuova risorsa Book */ public function create() { // } /** * Salva una nuova risorsa Book nel databse */ public function store(Request $request) { // } /** * Mostra la risorsa Book con l'id fornito */ public function show($id) { // } /** * Mostra il form per modificare la risorsa Book con l'id fornito */ public function edit($id) { // } /** * Aggiorna la risorsa Book con l'id fornito sul database coi dati inviati */ public function update(Request $request, $id) { // } /** * Elimina la risorsa Book con l'id fornito sul database */ public function destroy($id) { // } }
I controller di tipo resource possono essere “attivati” registrando una rotta di tipo resource nel file routes/web.php o routes/api.php a seconda che si voglia realizzare un gruppo di rotte di tipo web o api.
use App\Http\Controllers\BookController; Route::resource('/books', BookController::class);
In questo caso, Laravel realizzerà implicitamente tutte le associazioni necessarie per gestire le varie combinazioni di metodi e path con e senza parametri.
Metodo HTTP | URI | Metodo del controller |
---|---|---|
GET | /books | index |
GET | /books/create | create |
POST | /books | store |
GET | /books/{book} | show |
GET | /books/{book}/edit | edit |
PUT/PATCH | /books/{book} | update |
DELETE | /books/{book} | destroy |
Collegamento a un model in Laravel
Il resource controller mostrato poco sopra non è, però, direttamente collegato ad un model. Il comando make di artisan, infatti, permette di creare la struttura del controller, generando i metodi previsti, ma non inserisce alcuna logica per recuperare le informazioni dal database.
Si è, quindi, liberi di realizzare nel modo più opportuno il codice necessario a recuperare o salvare da database.
Sicuramente, se per la risorsa sul database abbiamo già disponibile un model, risulterà più agevole utilizzare direttamente il model e lasciare che Laravel e Eloquent riuniscano insieme i vari pezzi.
Nel nostro caso, quindi, potremmo aggiornare i vari metodi del controller per avere qualcosa tipo
public function store(Request $request) { $arguments = $request->validate([/* regole di validazione qui */]) Book::create($arguments) } public function show(Book $movie) { return Book::find($movie); }
Laravel provvederà a fornire, con vari automatismi già visti altrove, tutto ciò che serve per fare in modo che, alla richiesta GET /books/42 venga restituito il contenuto della riga con id 42 della tabella books.
È, ovviamente, possibile attivare e collegare ogni altra funzione messa a disposizione da Laravel ed Eloquent, come, per esempio, la paginazione per i risultati del metodo index oppure l’utilizzo di form request dedicate per le azioni di creazioni e modifica della risorsa.