Slide 1

Slide 1 text

15 Juillet 2014 Routing Symfony & CMF sfPot Paris 1 1 mardi 15 juillet 14

Slide 2

Slide 2 text

@GromNaN Jérôme TAMARELLE Lead Developer @LExpress 2 2 mardi 15 juillet 14

Slide 3

Slide 3 text

Routing ? « Le Composant de Routage fait correspondre une requête HTTP à un ensemble de variables de configuration. » (Readme) « Le routeur fait correspondre l'URL entrante à une route spécifique et retourne l'information à propos de la route, incluant le contrôleur qui devrait être exécuté. » (Cookbook) 3 3 mardi 15 juillet 14

Slide 4

Slide 4 text

4 4 mardi 15 juillet 14

Slide 5

Slide 5 text

• $router-­‐>setRequestContext($context); $parameters  =  $router-­‐>match('/hello/ paris'); array  (        '_route'  =>  'hello',        '_controller'  =>  'say_hello',        'name'  =>  'paris', ); • Le composant est autonome, utilisable sans autre dépendance. UrlMatcher 5 5 mardi 15 juillet 14

Slide 6

Slide 6 text

• use Symfony\Component\HttpFoundation \Request; $matcher->matchRequest(Request $request); • « While UrlMatcherInterface is only for matching URLs with routes, RequestMatcherInterface allows to match RequestMatcher (2.1+) 6 6 mardi 15 juillet 14

Slide 7

Slide 7 text

Configuration des Routes #  routing.yml hello:        path:      /hello/{name}        defaults:    {  _controller:  say_hello,   name:  world  }        requirements:                name:    \w+ Les routes sont compilées en PHP optimisé par le RouteCompiler. 7 7 mardi 15 juillet 14

Slide 8

Slide 8 text

Chaque fichier de configuration (YAML, XML, Annotations ou PHP) gènère une « RouteCollection » qui peut être importée dans une autre. #  main_routing.yml hello:        resource:  "routing.yml"        prefix:      /demo 8 8 mardi 15 juillet 14

Slide 9

Slide 9 text

• L’URL : path (/) • Le domaine : host (afsy.fr) • La méthode : method (GET, POST, ...) • Le protocole : scheme (http, https) Une route peut tester : 9 9 mardi 15 juillet 14

Slide 10

Slide 10 text

UNE ROUTE NE TESTE PAS : La valeur d’un en-tête HTTP L’authentification de l’utilisateur Une valeur dynamique en base de données 10 10 mardi 15 juillet 14

Slide 11

Slide 11 text

Le contrôleur est configuré par les attributs de la route 11 11 mardi 15 juillet 14

Slide 12

Slide 12 text

Attributs spéciaux _route Nom de la route _controller Nom logique transformé en callable par le ControllerResolver _locale Code le langue analysé par le LocaleListener _format Content-Type de la réponse _template Template utilisé après le contrôleur par SensioFrameworkExtraBundle 12 12 mardi 15 juillet 14

Slide 13

Slide 13 text

Rediriger une URL sans contrôleur spécifique root: pattern: / defaults: _controller: FrameworkBundle:Redirect:urlRedirect path: /app permanent: true http://symfony.com/fr/doc/current/cookbook/routing/redirect_in_config.html 13 13 mardi 15 juillet 14

Slide 14

Slide 14 text

Afficher un template sans contrôleur spécifique about: pattern: /about defaults: _controller: FrameworkBundle:Template:template template: AppBundle:About:index.html.twig 14 14 mardi 15 juillet 14

Slide 15

Slide 15 text

Comment gérer des URL dynamiques ? Home : http://www.lexpress.fr Liste : http://lentreprise.lexpress.fr/high-tech-innovation/liste.html Article : http://www.lexpress.fr/emploi/conseils-emploi/rechercher-un-emploi- pendant-l-ete-une-bonne-idee_1558541.html Vidéo : http://videos.lexpress.fr/actualite/societe/video-le-defile-du-14-juillet-vu- de-l-interieur-d-un-helicoptere_1559355.html Diaporama : http://lentreprise.lexpress.fr/diaporama/diapo-photo/creation- entreprise/idees-business/quatre-petites-start-up-dans-la-prairie_1546463.html 15 15 mardi 15 juillet 14

Slide 16

Slide 16 text

Symfony CMF / Routing https://github.com/symfony-cmf/Routing ChainRouter NestedRouter DynamicRouter https://github.com/symfony-cmf/RoutingBundle 16 16 mardi 15 juillet 14

Slide 17

Slide 17 text

ChainRouter Appel plusieurs routeurs par ordre de priorité jusqu’à trouver celui qui match la requête. use Symfony\Cmf\Component\Routing\ChainRouter; $chainRouter = new ChainRouter(); $chainRouter->add(new DynamicRouter(...), 100); $chainRouter->add(new DefaultRouter(...), 0); $chainRouter->matchRequest($request); 17 17 mardi 15 juillet 14

Slide 18

Slide 18 text

NestedMatcher Routes stockées en BDD (PHPCR ou autre) Charge uniquement les routes pouvant potentiellement matcher la requête $routeCollection = $routeProviter ->getRouteCollectionForRequest($request); Puis compile les routes et confronte la requête 18 18 mardi 15 juillet 14

Slide 19

Slide 19 text

DynamicRouter Encapsule un router Exécute des « Route Enhancers » pour enrichir les attributs du routing : Définir le contrôleur Renommer des attributs Définir des valeurs par défaut 19 19 mardi 15 juillet 14

Slide 20

Slide 20 text

20 20 mardi 15 juillet 14

Slide 21

Slide 21 text

Attributs spéciaux du Routing CMF _route_object Objet Route retenu _content Contenu associé à la requête _template Nom du template à utiliser 21 21 mardi 15 juillet 14

Slide 22

Slide 22 text

Pour aller plus loin http://symfony.com/doc/master/cmf/book/ routing.html http://fabien.potencier.org/article/53/create- your-own-framework-on-top-of-the-symfony2- components-part-4 22 22 mardi 15 juillet 14

Slide 23

Slide 23 text

Merci Questions ? 23 23 mardi 15 juillet 14