X

Liaison de modèle de route implicite dans Laravel 5.2


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é shoeil 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 idmais 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.