Routage


1Routage de base

Le routage de base de Temma est volontairement très simple.

Par défaut, les URLs sont mappées sur les noms des contrôleurs.

Lors d'une connexion à www.site.com/article/show/123/title
Temma exécute le code Article::show(123, 'title')
et utilise le template article/show.tpl

Les routes permettent de définir des «contrôleurs virtuels», servant d'alias aux contrôleurs réels. C'est particulièrement utile pour permettre l'accès à des contrôleurs sous des noms de fichiers (tels que les classiques robots.txt et sitemap.xml).

Cela permet aussi d'avoir un même contrôleur qui répond sur plusieurs URL différentes, en faisant éventuellement des traitements différents en fonction du nom de contrôleur demandé.

Exemple de configuration dans le fichier etc/temma.php :

[
    'routes' => [
        'article'              => 'Posts',
        'sitemap.xml'          => '\App\Controllers\Sitemap',
        'sitemap.extended.xml' => '\App\Controllers\ExtendedSitemap',
    ]
]
  • Ligne 2 : Définition des routes.
  • Ligne 3 : Définition du contrôleur virtuel article, qui est un alias du contrôleur Posts.
    Par exemple, un appel à l'URL http://www.site.com/article/list appelera la méthode list() de l'objet Posts.
  • Ligne 4 : On fait en sorte qu'un appel à l'URL http://www.site.com/sitemap.xml entraîne l'exécution de la méthode __invoke() du contrôleur \App\Controllers\Sitemap.
  • Ligne 5 : On fait en sorte qu'un appel à l'URL http://www.site.com/sitemap.extended.xml entraîne l'exécution de la méthode __invoke() du contrôleur \App\Controllers\ExtendedSitemap.

2Routage avancé

Le plugin \Temma\Plugins\Router permet d'activer un routage plus élaboré.

Il doit être activé dans le fichier etc/temma.php comme un pré-plugin, et il utilise une configuration étendue pour définir les contrôleurs/actions à exécuter en fonction de l'URL appelée.

Les objets à appeler comme contrôleurs doivent obligatoirement commencer avec un caractère backslash (\), même s'ils sont placés dans le namespace global.
Si une URL n'est pas définie dans la configuration du plugin, Temma utilisera les valeurs définies dans la configuration générale (notamment les directives rootController et defaultController). La directive proxyController est toujours prioritaire.

[
 'plugins' => [
     '_pre' => [
         '\Temma\Plugins\Router',
     ]
 ],
 'x-router' => [
     'GET:/articles'                                   => '\MyApp\Ctrl\Cms::list()',
     'GET:/articles/[sort:enum:alpha,date]'            => '\MyApp\Ctrl\Cms::list($sort)',
     'GET:/articles/[sort:enum:alpha,date]/[page:int]' => '\MyApp\Ctrl\Cms:list($sort, $page, "#f00")',
     '*:/article/[id:int]/[title:string]'              => '\MyApp\Ctrl\Cms::show($id, $title)',
 ]
]
  • Ligne 4 : L'objet \Temma\Plugins\Router est défini comme pré-plugin. Il prendra ainsi la main et pourra modifier les plugins, le contrôleur et l'action qui seront exécutés par le framework.
  • Ligne 7 : Configuration étendue spécifique au routeur avancé.
  • Lignes 8 et 9 : On définit que pour l'URL /articles appelée en GET, il faut exécuter la méthode list() de l'objet \MyApp\Ctrl\Cms.
  • Lignes 10 et 11 : On définit qu'un appel en GET de l'URL /articles/ peut être suivie d'un paramètre (qu'on nommera sort) qui ne peut contenir que les valeurs alpha ou date. Dans ce cas, il faudra exécuter la méthode list() de l'objet \MyApp\Ctrl\Cms, en lui fournissant en paramètre la valeur sort.
  • Lignes 12 et 13 : Un appel en GET de l'URL /articles/ peut aussi recevoir deux paramètres. Le premier est un type de tri (comme vu juste au-dessus), le second est un numéro de page. La méthode list() est alors appelée, avec le type de tri en premier paramètre, le numéro de page en second paramètre, et une chaîne de caractères fixe en troisième paramètre.
  • Lignes 14 et 15 : On définit que pour l'URL /article/, suivie d'un paramètre de type entier (qu'on nommera id) et d'un paramètre de type texte (nommé title), il faut exécuter la méthode show() de l'objet \MyApp\Ctrl\Cms, en lui fournissant en paramètre les valeurs id et title récupérés depuis l'URL. C'est route fonctionne quelle que soit la méthode utilisée (GET, POST, PUT …).

En plus de définir l'action à exécuter pour chaque route, il est aussi possible de définir les pré-plugins et post-plugins à appeler.

[
 'x-router' => [
     'GET:/articles'                             => '\MyApp\Ctrl\Cms::list()',
     'GET:/articles/[sort:enum:alpha,date,mark]' => '\MyApp\Ctrl\Cms::list($sort)',
     '*:/article/[id:int]/[title:string]'        => '\MyApp\Ctrl\Cms::show($id, $title)',
     'POST:/article' => 
         '_pre' => '\MyApp\Plugins\Auth',
         'action' => '\MyApp\Ctrl\Cms::create()',
         '_post' => [
             '\MyApp\Plugins\LogFlow',
             '\MyApp\Plugins\EmailToAdmin',
         ],
     ],
     'PUT:/article/[id:int]' => [
         '_pre' => [
             '\MyApp\Plugins\Auth',
             '\MyApp\Plugins\DataCheck',
         ],
         'action' => '\MyApp\Ctrl\Cms::update($id)',
         '_post'  => '\MyApp\Plugins\LogFlow',
     ],
 ]
]
  • Ligne 9 : On définit une route pour l'URL /article appelée en POST.
    • Ligne 10 : On demande à ce qu'un pré-plugin soit exécuté pour cette route.
    • Ligne 11 : On spécifie le contrôleur et l'action associés à cette route.
    • Ligne 12 à 15 : On configure deux post-plugins à exécuter pour cette route. Dans le cas où il y a plusieurs plugins, il faut créer une liste.
  • Ligne 17 : On définit une route pour l'URL /article/, suivie d'un paramètre de type entier (qu'on nommera id), appelée avec la méthode PUT.
    • Ligne 18 à 21 : Il y a deux pré-plugins pour cette route.
    • Ligne 22 : On spécifie le contrôleur et l'action associés à cette route.
    • Ligne 23 : Il y a un post-plugin pour cette route.