Statamic Peak

Article

Laravel : Route Parameter

Il est possible de définir des paramètres au sein de vos routes. Ils sont automatiquement injectés dans la fonction de votre controller dans l'ordre où ils apparaissent.

Il est possible de définir des paramètres au sein de vos routes. Ils sont automatiquement injectés dans la fonction de votre controller dans l'ordre où ils apparaissent.

Cela permet d'avoir un seul controller pour traiter des routes au contenu différent. Dans notre exemple, une seule route pour tous nos utilisateurs, mêmes si leur id change à chaque fois. C'est quand même plus pratique!

Le paramètre de la fonction n'est pas obligé d'avoir le même nom que le paramètre de la route.

<?php

use Illuminate\Http\Request;

Route::get('/user/{id}', function (Request $request, $id) {
    return 'User '.$id;
});

Vous avez besoin d'informations plus générales sur Laravel ? Vous trouverez tout ce qu'il faut savoir sur le framework dans mon compendium Laravel !

Paramètres optionnels

Les paramètres optionnels vous permettent d'avoir des segments d'URL non présents. Cela permet par exemple d'afficher tous les utilisateurs inscrits entre 2 dates. Quand elles ne sont pas définis, on peut choisir par convention de ne pas limiter la borne.

Attention à ne pas avoir de doublons dans vos routes. En effet, les routes /users/ et /users/{id?}entreront en conflit dans le cas où le paramètre n'est pas présent.

<?php

Route::get('/path/{start?}/{end?}', function ($start = null, $end = null)
{
    if (!$start) {
        // set start
    }
    if (!$end) {
        // set end
    }
    // do other stuff
}

Paramètres de route et Model

Bien souvent, les paramètres d'URL servent à rechercher un model présent en base de données. Comme c'est un cas très fréquent, Laravel propose une récupération automatique du model en se basant sur le nom du paramètre.

Attention à bien donner le nom d’un modèle au paramètre de la route, sinon cela ne fonctionnera pas. Si la convention par défaut ne vous convient pas, il est aussi possible de faire des liaisons explicites.

<?php

use App\Models\User;

Route::get('/users/{user}', function (User $user) {
    return $user->email;
});

Il est possible de récupérer un modèle à partir d'un champ autre que son id. Il y a 2 façons de faire, soit lors de la définition de la route pour un usage ponctuel, soit directement dans le modèle pour un usage pour chaque route.

<?php
// routes
use App\Models\Post;

Route::get('/posts/{post:slug}', function (Post $post) {
    return $post;
});

// ou dans votre modèle
public function getRouteKeyName()
{
    return 'slug';
}

Quand aucun modèle ne correspond, Laravel renvoie automatiquement une 404 mais ce n'est pas toujours ce qu'on souhaite. Dans ce cas, on peut fournir une Closure qui sera lancée à la place. Bonne nouvelle, cela fonctionne même avec la mise en cache des routes.

<?php
use App\Http\Controllers\LocationsController;
use Illuminate\Http\Request;

Route::get('/locations/{location:slug}', [LocationsController::class, 'show'])
        ->name('locations.view')
        ->missing(function (Request $request) {
            return Redirect::route('locations.index');
        });

Pour rappel, il est possible de mettre en cache ses routes pour grandement diminué le temps d'enregistrement des routes au démarrage du framework.

php artisan route:cache