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 :
Résultat :
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 :
Résultat (pour ville.id = 42) :
Exemple dans un lien :
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 :
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.