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 :
<?php
return [
'routes' => [
'article' => 'Posts',
'sitemap.xml' => '\App\Controllers\Sitemap',
'sitemap.extended.xml' => '\App\Controllers\ExtendedSitemap',
]
];
- Ligne 4 : Définition des routes.
-
Ligne 5 : 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 6 : 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 7 : 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.
<?php
return [
'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 6 : 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 9 : Configuration étendue spécifique au routeur avancé.
- Lignes 10 et 11 : 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 12 et 13 : 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 14 et 15 : 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 16 et 17 : 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.
<?php
return [
'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 11 : On définit une route pour l'URL /article appelée en POST.
- Ligne 12 : On demande à ce qu'un pré-plugin soit exécuté pour cette route.
- Ligne 13 : On spécifie le contrôleur et l'action associés à cette route.
- Ligne 14 à 17 : 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 19 : 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 20 à 23 : Il y a deux pré-plugins pour cette route.
- Ligne 24 : On spécifie le contrôleur et l'action associés à cette route.
- Ligne 25 : Il y a un post-plugin pour cette route.