Si vous ne l’avez jamais utilisé, la liaison du modèle d’itinéraire de Laravel existe depuis un certain temps, mais Laravel 5.2 est sur le point de le rendre encore plus facile.
Les bases de la liaison de modèle de route
Supposons qu’un modèle courant pour lier une route d’URL ressemble à ceci :
Route::get('shoes/{id}', function ($id) {
$shoe = Shoe::findOrFail($id);
// Do stuff
});
C’est quelque chose que je fais un parcelle. Ne serait-ce pas bien si vous pouviez laisser tomber le findOrFail
ligne et apprenez simplement au routeur de Laravel que cette route représente une chaussure ? Tu peux. Dans votre fournisseur de services d’itinéraire, apprenez simplement au routeur : $router->model('shoe', 'App\Shoe');
Cela signifie, “chaque fois que j’ai un paramètre de route nommé shoe
il s’agit d’un ID représentant une instance de App\Shoe
“. Cela nous permet de réécrire le code ci-dessus comme ceci :
Route::get('shoes/{shoe}', function ($shoe) {
// Do stuff
});
Liaison de modèle de route implicite
Dans Laravel 5.2, il est encore plus facile d’utiliser la liaison de modèle de route. Tapez simplement un paramètre dans la route Closure (ou votre méthode de contrôleur) et nommez le paramètre de la même manière que le paramètre de route, et il le traitera automatiquement comme une liaison de modèle de route :
Route::get('shoes/{shoe}', function (App\Shoe $shoe) {
// Do stuff
});
Cela signifie que vous pouvez désormais bénéficier des avantages de la liaison du modèle de routage sans avoir à définir quoi que ce soit dans le fournisseur de services de routage. Facile!
C’est tout pour la liaison de modèle de route implicite ! Tout ce qui se passe après ce point est déjà présent dans la 5.1.
Fonctionnalités peu connues de la liaison de modèle de route
Ces fonctionnalités ne sont pas nouvelles avec 5.2, et ne sont donc pas spécifiques à la liaison de modèle de route implicite, mais elles semblent ne pas être connues de tous, alors j’ai pensé les ajouter ici.
Logique de liaison personnalisée pour la liaison du modèle de routage
Si vous souhaitez personnaliser la logique qu’une liaison de modèle de route utilise pour rechercher et renvoyer une instance de votre modèle, vous pouvez passer Closure comme deuxième paramètre d’une liaison explicite au lieu de passer un nom de classe :
$router->bind('shoe', function ($value) {
return App\Shoe::where('slug', $value)->where('status', 'public')->first();
});
Exceptions personnalisées pour la liaison du modèle de route
Vous pouvez également personnaliser les exceptions levées par les liaisons du modèle de routage (si elles ne trouvent pas d’instance de ce modèle) en transmettant un Closure comme troisième paramètre :
$router->model('user', 'App\User', function () {
throw new NotFoundHttpException;
});
Changer la “clé de route” d’un modèle Eloquent
Par défaut, Laravel suppose qu’un modèle Eloquent doit correspondre aux segments d’URL en utilisant son id
colonne. Mais que se passe-t-il si vous vous attendez à ce qu’il toujours mapper sur une limace, comme dans mon exemple de logique de liaison personnalisée de chaussures ci-dessus ?
Eloquent met en œuvre le Illuminate\Contracts\Routing\UrlRoutable
contrat, ce qui signifie que chaque objet Eloquent a un getRouteKeyName()
méthode qui définit quelle colonne doit être utilisée pour la rechercher à partir d’une URL. Par défaut, il est réglé sur id
mais vous pouvez remplacer cela sur n’importe quel modèle Eloquent :
class Shoe extends Model
{
public function getRouteKeyName()
{
return 'slug';
}
}
Maintenant, je peux utiliser une liaison de modèle de route explicite ou implicite, et il recherchera des chaussures où le slug
colonne est égale à mon segment d’URL. Beau.