Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
framework-web:symfony:routing [2018/01/25 13:32] – créée jcheron | framework-web:symfony:routing [2019/08/31 14:21] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Routing ====== | ====== Routing ====== | ||
+ | Le composant **router** de symfony permet de solliciter la méthode d'un contrôleur, | ||
+ | Les routes peuvent être définies par l' | ||
+ | * de l' | ||
+ | * en php | ||
+ | * en yaml | ||
+ | * en xml | ||
+ | |||
+ | La méthode la plus souple est l' | ||
+ | |||
+ | <sxh bash; | ||
+ | composer require annotations | ||
+ | </ | ||
+ | |||
+ | ===== Création ===== | ||
+ | |||
+ | Création de routes avec l' | ||
+ | |||
+ | <sxh php; | ||
+ | namespace App\Controller; | ||
+ | |||
+ | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | ||
+ | use Symfony\Component\Routing\Annotation\Route; | ||
+ | |||
+ | class BlogController extends Controller | ||
+ | { | ||
+ | /** | ||
+ | * Matches /blog exactly | ||
+ | * | ||
+ | * @Route("/ | ||
+ | */ | ||
+ | public function list() | ||
+ | { | ||
+ | // ... | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Matches /blog/* | ||
+ | * | ||
+ | * @Route("/ | ||
+ | */ | ||
+ | public function show($slug) | ||
+ | { | ||
+ | // $slug will equal the dynamic part of the URL | ||
+ | // e.g. at / | ||
+ | |||
+ | // ... | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | Dans la console, la commande suivante liste les routes existantes : | ||
+ | |||
+ | <sxh bash; | ||
+ | php bin/console debug: | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Paramètres de route et requirements ===== | ||
+ | |||
+ | Les paramètres de routes sont passés à l'aide des accolades : | ||
+ | |||
+ | <sxh php; | ||
+ | namespace App\Controller; | ||
+ | |||
+ | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | ||
+ | use Symfony\Component\Routing\Annotation\Route; | ||
+ | |||
+ | class BlogController extends Controller | ||
+ | { | ||
+ | /** | ||
+ | * @Route("/ | ||
+ | */ | ||
+ | public function list($page) | ||
+ | { | ||
+ | // ... | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * @Route("/ | ||
+ | */ | ||
+ | public function show($slug) | ||
+ | { | ||
+ | // ... | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Dans l' | ||
+ | |||
+ | Le router choisira toujours dans ce cas la première correspondance trouvée : la route **blog_list**, | ||
+ | |||
+ | Il est possible d' | ||
+ | |||
+ | On ajoute dans ce cas un " | ||
+ | |||
+ | <sxh php; | ||
+ | namespace App\Controller; | ||
+ | |||
+ | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | ||
+ | use Symfony\Component\Routing\Annotation\Route; | ||
+ | |||
+ | class BlogController extends Controller | ||
+ | { | ||
+ | /** | ||
+ | * @Route("/ | ||
+ | */ | ||
+ | public function list($page) | ||
+ | { | ||
+ | // ... | ||
+ | } | ||
+ | |||
+ | // ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Valeur par défaut ===== | ||
+ | Il est possible de donner à un paramètre une valeur par défaut : | ||
+ | <sxh php; | ||
+ | namespace App\Controller; | ||
+ | |||
+ | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | ||
+ | use Symfony\Component\Routing\Annotation\Route; | ||
+ | |||
+ | class BlogController extends Controller | ||
+ | { | ||
+ | /** | ||
+ | * @Route("/ | ||
+ | */ | ||
+ | public function list($page = 1) | ||
+ | { | ||
+ | // ... | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Méthode HTTP ===== | ||
+ | L' | ||
+ | |||
+ | <sxh php; | ||
+ | namespace App\Controller; | ||
+ | |||
+ | // ... | ||
+ | |||
+ | class BlogApiController extends Controller | ||
+ | { | ||
+ | /** | ||
+ | * @Route("/ | ||
+ | */ | ||
+ | public function show($id) | ||
+ | { | ||
+ | // ... return a JSON response with the post | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * @Route("/ | ||
+ | */ | ||
+ | public function edit($id) | ||
+ | { | ||
+ | // ... edit a post | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Paramètres de routage spéciaux ===== | ||
+ | |||
+ | 4 paramètres spéciaux sont utilisable au niveau des routes : | ||
+ | |< | ||
+ | ^ _controller | Permet de spécifier le contrôleur à exécuter quand la route est sollicitée. | | ||
+ | ^_format | Utilisé pour définir le format de la requête (html, json...) voir [[https:// | ||
+ | ^_fragment | Utilisé pour définir le fragment après le # dans le cas d'une url interne à la page | | ||
+ | ^_locale |Utilisé pour définir la " | ||
+ | |||
+ | Exemple : | ||
+ | |||
+ | <sxh php; | ||
+ | |||
+ | // ... | ||
+ | class ArticleController extends Controller | ||
+ | { | ||
+ | /** | ||
+ | * @Route( | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | * ) | ||
+ | */ | ||
+ | public function show($_locale, | ||
+ | { | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Génération d'URLs ===== | ||
+ | |||
+ | ==== Depuis un contrôleur ==== | ||
+ | |||
+ | <sxh php> | ||
+ | class MainController extends Controller | ||
+ | { | ||
+ | public function show($slug) | ||
+ | { | ||
+ | // ... | ||
+ | |||
+ | // / | ||
+ | $url = $this-> | ||
+ | ' | ||
+ | array(' | ||
+ | ); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== URL avec paramètres ==== | ||
+ | Les variables supplémentaires sont ajoutées en tant que query string : | ||
+ | <sxh php> | ||
+ | $this-> | ||
+ | ' | ||
+ | ' | ||
+ | )); | ||
+ | // / | ||
+ | </ | ||
+ | |||
+ | ==== Génération depuis un service ==== | ||
+ | |||
+ | Il est nécessaire d' | ||
+ | |||
+ | <sxh php; | ||
+ | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | ||
+ | |||
+ | class SomeService | ||
+ | { | ||
+ | private $router; | ||
+ | |||
+ | public function __construct(UrlGeneratorInterface $router) | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | public function someMethod() | ||
+ | { | ||
+ | $url = $this-> | ||
+ | ' | ||
+ | array(' | ||
+ | ); | ||
+ | // ... | ||
+ | } | ||
+ | } | ||
+ | </ |