framework-web:symfony:routing

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
framework-web:symfony:routing [2018/01/25 14:04] jcheronframework-web:symfony:routing [2019/08/31 14:21] (Version actuelle) – modification externe 127.0.0.1
Ligne 15: Ligne 15:
  
 ===== Création ===== ===== Création =====
 +
 +Création de routes avec l'annotation @Route
  
 <sxh php;title:src/Controller/BlogController.php> <sxh php;title:src/Controller/BlogController.php>
Ligne 44: Ligne 46:
         // e.g. at /blog/yay-routing, then $slug='yay-routing'         // e.g. at /blog/yay-routing, then $slug='yay-routing'
  
 +        // ...
 +    }
 +}
 +</sxh>
 +
 +
 +Dans la console, la commande suivante liste les routes existantes :
 +
 +<sxh bash;gutter:false>
 +php bin/console debug:router
 +</sxh>
 +
 +
 +===== Paramètres de route et requirements =====
 +
 +Les paramètres de routes sont passés à l'aide des accolades :
 +
 +<sxh php;title:src/Controller/BlogController.php>
 +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)
 +    {
 +        // ...
 +    }
 +}
 +</sxh>
 +
 +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 ce 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 :
 +
 +<sxh php;title:src/Controller/BlogController.php;highlight:[9]>
 +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)
 +    {
 +        // ...
 +    }
 +
 +    // ...
 +}
 +</sxh>
 +
 +===== Valeur par défaut =====
 +Il est possible de donner à un paramètre une valeur par défaut :
 +<sxh php;title:src/Controller/BlogController.php;highlight:[9]>
 +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 = 1)
 +    {
 +        // ...
 +    }
 +}
 +</sxh>
 +
 +===== Méthode HTTP =====
 +L'ajout de l'attribut **methods** à la route permet de spécifier la/les méthode(s) utilisables : 
 +
 +<sxh php;title:src/Controller/BlogApiController.php>
 +namespace App\Controller;
 +
 +// ...
 +
 +class BlogApiController extends Controller
 +{
 +    /**
 +     * @Route("/api/posts/{id}", methods={"GET","HEAD"})
 +     */
 +    public function show($id)
 +    {
 +        // ... return a JSON response with the post
 +    }
 +
 +    /**
 +     * @Route("/api/posts/{id}", methods="PUT")
 +     */
 +    public function edit($id)
 +    {
 +        // ... edit a post
 +    }
 +}
 +</sxh>
 +
 +===== Paramètres de routage spéciaux =====
 +
 +4 paramètres spéciaux sont utilisable au niveau des routes :
 +|<100%>|
 +^ _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://symfony.com/doc/current/routing.html#routing-format-param|format param]]. |
 +^_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 "locale" de la requête (fr/en...) voir [[https://symfony.com/doc/current/translation/locale.html#translation-locale-url|locale]] |
 +
 +Exemple :
 +
 +<sxh php;title:src/Controller/ArticleController.php>
 +
 +// ...
 +class ArticleController extends Controller
 +{
 +    /**
 +     * @Route(
 +         "/articles/{_locale}/{year}/{slug}.{_format}",
 +         defaults={"_format": "html"},
 +         requirements={
 +             "_locale": "en|fr",
 +             "_format": "html|rss",
 +             "year": "\d+"
 +         }
 +     * )
 +     */
 +    public function show($_locale, $year, $slug)
 +    {
 +    }
 +}
 +</sxh>
 +
 +===== Génération d'URLs =====
 +
 +==== Depuis un contrôleur ====
 +
 +<sxh php>
 +class MainController extends Controller
 +{
 +    public function show($slug)
 +    {
 +        // ...
 +
 +        // /blog/my-blog-post
 +        $url = $this->generateUrl(
 +            'blog_show',
 +            array('slug' => 'my-blog-post')
 +        );
 +    }
 +}
 +</sxh>
 +
 +==== URL avec paramètres ====
 +Les variables supplémentaires sont ajoutées en tant que query string :
 +<sxh php>
 +$this->generateUrl('blog_list', array(
 +    'page' => 2,
 +    'category' => 'Symfony',
 +));
 +// /blog/2?category=Symfony
 +</sxh>
 +
 +==== Génération depuis un service ====
 +
 +Il est nécessaire d'injecter une instance de **UrlGeneratorInterface**
 +
 +<sxh php;title:src/Service/SomeService.php>
 +use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 +
 +class SomeService
 +{
 +    private $router;
 +
 +    public function __construct(UrlGeneratorInterface $router)
 +    {
 +        $this->router = $router;
 +    }
 +
 +    public function someMethod()
 +    {
 +        $url = $this->router->generate(
 +            'blog_show',
 +            array('slug' => 'my-blog-post')
 +        );
         // ...         // ...
     }     }
 } }
 </sxh> </sxh>
  • framework-web/symfony/routing.1516885443.txt.gz
  • Dernière modification : il y a 6 ans
  • (modification externe)