Una volta acquisita una conoscenza basilare sulle routes in Laravel, vediamo come possono aiutarci al di là della semplice riscrittura degli URL. Una delle capacità del framework, è quella che riguarda il Model Binding. Quando proviamo ad iniettare un ID di un model ad un controller collegato ad una Route, di solito facciamo la query nel database per cercare quel Model con quel determinato ID. In sostanza facciamo la query sulla tabella collegata per capire se c’è una riga (tupla) con quello specifico ID. Laravel offre un metodo rapido per iniettare il Model direttamente nella route: Un esempio vale più di tante parole:
use App\Models\Articolo; Route::get('/articolo/{articolo}', function (Articolo $articolo) { return $articolo->titolo; });
In questo esempio, applichiamo quello che si chiama Implicit binding, ovvero diciamo a Laravel di risolvere automaticamente il tipo di Model specificando il tipo del parametro, in pratica facendo il type-hinting del parametro $articolo
. In questo modo il framework cercherà il Model con l’ID corrispondente passato al segmento {articolo}
dell’URI. Nel caso indicassimo un ID che non esiste nel database, otterremo un errore HTTP 404.
Basandoci sugli esempi precedenti, possiamo naturalmente utilizzare questa tecnica anche quando utilizziamo i metodi delle classi Controller. L’esempio precedente diventa:
use App\Http\Controllers\ArticoloController; Route::get('/articolo/{articolo}', [ArticoloController::class, 'show']); // ..poi, nella pagina del Controller, dovremmo aggiungere il metodo "show" public function show(Articolo $articolo) { return $articolo->titolo; }
Completiamo i nostri esempi con un altro caso, molto diffuso: quello di selezionare un Model non attraverso il suo ID, ma utilizzando un altro campo. Un esempio classico è quello di selezionare un model Articolo tramite il suo slug:
use App\Models\Articolo; Route::get('/articolo/{articolo:slug}', function (Articolo $articolo) { return $articolo->nome; });
Se invece volessimo cambiare in modo definitivo quale campo il Model biding utilizzerà per pescare il nostro Model, possiamo farlo modificando la pagina php del Model, specificandolo nel metodo getRouteKeyName()
, come in questo esempio:
/** * Get the route key for the model. * * @return string */ public function getRouteKeyName() { return 'slug'; }
Afferrati questi concetti basilari, vediamo come utilizzare la tecnica dello Scoping. Più avanti in questa guida vedremo come creare relazioni tra uno o più Model (es. gli Articolo
hanno un Produttore
), ma possiamo già iniziare a capire la potenza delle routes in Laravel e come il legame tra Model può essere sfruttato per creare delle routes che hanno un Model Binding con lo Scoping.
use App\Models\Produttore; use App\Models\Articolo; Route::get('/produttore/{produttore}/articolo/{articolo}', function (Produttore $produttore, Articolo $articolo) { return $articolo; })->scopeBindings();
In questo esempio, Laravel cercherà solo i model Articolo
che sono “figli di” model Produttore
, e che quindi hanno un legame con esso. Viene dato per scontato quindi che vi sia una relazione tra i due, ovvero un’associazione di qualche tipo. Tenete per buono questo esempio, tutto sarà più chiaro una volta che vedremo le relations tra model.