Aller au contenu

Route : générer une URL à partir du nom d'une route

La classe Route permet de reconstruire l'URL d'une route à partir de son nom, plutôt que d'écrire son chemin en dur dans les templates ou les controllers.

Cette fonctionnalité est disponible à partir de la version v2.1.0.

Le nom d'une route

Le nom d'une route est la clé principale définie dans le fichier de configuration des routes app/Config/routes.yaml :

villeread:                    # <-- nom de la route
  uri: /ville
  controller: Controller\VilleReadController
  httpMethod: [GET]
villeupdate:
  uri: '/ville/{id}/update'
  controller: Controller\VilleUpdateController
  httpMethod: [GET, POST]

Si vous changez l'uri d'une route, tous les liens générés par getNameToPath() suivent automatiquement.

Plusieurs méthodes dans un même controller

Depuis la version v2.4.0, la clé controller du fichier app/Config/routes.yaml peut désigner une méthode précise du controller avec la syntaxe Controller\MedecinController::index (voir Un controller, plusieurs routes).

Cela ne change rien pour getNameToPath() : la génération d'URL se base uniquement sur le nom et l'uri de la route.

Utilisation dans un template Twig

getNameToPath est une fonction Twig disponible dans tous vos templates :

{{ getNameToPath('villeread') }}

Résultat :

/ville

Avec des paramètres de route

Si la route contient des paramètres (ex. /ville/{id}/update), vous devez les passer en second argument sous la forme d'un tableau associatif :

{{ getNameToPath('villeupdate', {'id': ville.id}) }}

Résultat (pour ville.id = 42) :

/ville/42/update

Exemple dans un lien :

<a href="{{ getNameToPath('villeupdate', {'id': ville.id}) }}">Modifier</a>

Utilisation dans un controller

La même fonctionnalité est disponible en PHP via la classe Route :

use Studoo\EduFramework\Core\Controller\Route;

$url = (new Route())->getNameToPath('villeupdate', ['id' => 42]);
// $url contient : /ville/42/update

C'est utile pour les redirections après un traitement de formulaire :

header('Location: ' . (new Route())->getNameToPath('villeread'));

Gestion des erreurs

Si le nom de la route ou un paramètre est incorrect, une exception BadRouteException est levée :

Cause Message
Le nom de la route n'existe pas La route n'existe pas
Un paramètre de la route est manquant Le paramètre n'existe pas
use Studoo\EduFramework\Core\Exception\BadRouteException;

try {
    $url = (new Route())->getNameToPath('villeupdate'); // paramètre id manquant
} catch (BadRouteException $e) {
    // Le paramètre n'existe pas
}

Routes avec paramètre obligatoire

Une route avec un paramètre obligatoire (ex. /ville/{id}/delete) doit recevoir la valeur de ce paramètre. En revanche, un paramètre optionnel (ex. /user/{id}[/{name}]) peut être omis : getNameToPath('user', {'id': 1}) génère /user/1.