framework-web:symfony:routing

Ceci est une ancienne révision du document !


Routing

Le composant router de symfony permet de solliciter la méthode d'un contrôleur, en lui passant éventuellement des paramètres, en fonction de l'url demandée.

Les routes peuvent être définies par l'intermédiaire :

  • de l'annotation @Route
  • en php
  • en yaml
  • en xml

La méthode la plus souple est l'utilisation d'annotations. Elle nécessite l'installation du composant annotations :

composer require annotations

Création de routes avec l'annotation @Route

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;

class BlogController extends Controller
{
    /**
     * Matches /blog exactly
     *
     * @Route("/blog", name="blog_list")
     */
    public function list()
    {
        // ...
    }

    /**
     * Matches /blog/*
     *
     * @Route("/blog/{slug}", name="blog_show")
     */
    public function show($slug)
    {
        // $slug will equal the dynamic part of the URL
        // e.g. at /blog/yay-routing, then $slug='yay-routing'

        // ...
    }
}

Dans la console, la commande suivante liste les routes existantes :

php bin/console debug:router

Les paramètres de routes sont passés à l'aide des accolades :

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;

class BlogController extends Controller
{
    /**
     * @Route("/blog/{page}", name="blog_list")
     */
    public function list($page)
    {
        // ...
    }

    /**
     * @Route("/blog/{slug}", name="blog_show")
     */
    public function show($slug)
    {
        // ...
    }
}

Dans l'exemple précédent, les 2 routes sont en conflit, puisqu'elles correspondent toutes les 2 à une url du type /blog/*.

Le router choisira toujours dans ce cas la première correspondance trouvée : la route blog_list, ce qui est problématique.

Il est possible d'affiner le routage, en précisant pour la route blog_list que le paramètre page doit être un entier :

On ajoute dans ce cas un “requirement”, correspondant à une expression régulière :

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;

class BlogController extends Controller
{
    /**
     * @Route("/blog/{page}", name="blog_list", requirements={"page"="\d+"})
     */
    public function list($page)
    {
        // ...
    }

    // ...
}

  • framework-web/symfony/routing.1517357209.txt.gz
  • Dernière modification : il y a 6 ans
  • (modification externe)