Enrutamiento


1Enrutamiento básico

El enrutamiento básico de Temma es intencionalmente muy simple.

Por defecto, las URLs se asocian a los nombres de los controladores.

Al acceder a www.site.com/article/show/123/title
Temma ejecuta el código Article::show(123, 'title')
y usa la plantilla article/show.tpl

Las rutas se usan para definir "controladores virtuales", que sirven como alias de controladores reales. Esto es particularmente útil para permitir el acceso a controladores bajo nombres de archivo (como los clásicos robots.txt y sitemap.xml).

Esto también permite que un mismo controlador responda en varias URLs diferentes, haciendo posiblemente un procesamiento distinto según el nombre de controlador solicitado.

Ejemplo:

<?php

return [
    'routes' => [
        'article'              => 'Posts',
        'sitemap.xml'          => '\App\Controllers\Sitemap',
        'sitemap.extended.xml' => '\App\Controllers\ExtendedSitemap',
    ]
];
  • Línea 4: Definición de las rutas.
  • Línea 5: Definición del controlador virtual article, que es un alias del controlador Posts.
    Por ejemplo, una llamada a la URL http://www.site.com/article/list llamará al método list() del objeto Posts.
  • Línea 6: Nos aseguramos de que una llamada a la URL http://www.site.com/sitemap.xml resulte en la ejecución del método __invoke() del controlador \App\Controllers\Sitemap.
  • Línea 7: Nos aseguramos de que una llamada a la URL http://www.site.com/sitemap.extended.xml resulte en la ejecución del método __invoke() del controlador \App\Controllers\ExtendedSitemap.

2Enrutamiento avanzado

El plugin \Temma\Plugins\Router permite activar un enrutamiento más elaborado.

Debe activarse en el archivo etc/temma.php como pre-plugin, y usa una configuración extendida para definir qué controladores/acciones ejecutar según la URL llamada.

Los objetos que se llamarán como controladores deben empezar con una barra invertida (\), incluso si están colocados en el espacio de nombres global.
Si una URL no está definida en la configuración del plugin, Temma usará los valores definidos en la configuración general (en particular las directivas rootController y defaultController). La directiva proxyController siempre tiene prioridad.

<?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)',
 ]
];
  • Línea 6: El objeto \Temma\Plugins\Router se define como pre-plugin. Así tomará el control y podrá modificar los plugins, el controlador y la acción que ejecutará el framework.
  • Línea 9: Configuración extendida específica del enrutador avanzado.
  • Línea 10: Definimos que para la URL /articles llamada en GET, hay que ejecutar el método list() del objeto \MyApp\Ctrl\Cms.
  • Línea 11: Definimos que una llamada GET a la URL /articles/ puede ir seguida de un parámetro (al que llamaremos sort) que solo puede contener los valores alpha o date. En este caso, Temma deberá ejecutar el método list() del objeto \MyApp\Ctrl\Cms, pasándole el valor sort como parámetro.
  • Línea 12: Una llamada GET a la URL /articles/ también puede recibir dos parámetros. El primero es un tipo de orden (como se vio arriba), el segundo es un número de página. Se llama entonces al método list(), con el tipo de orden como primer parámetro, el número de página como segundo parámetro, y una cadena fija como tercer parámetro.
  • Línea 13: Definimos que para la URL /article/, seguida de un parámetro entero (que se llamará id) y un parámetro de texto (llamado title), Temma debe ejecutar el método show() del objeto \MyApp\Ctrl\Cms, proporcionándole los valores id y title recuperados de la URL como parámetros. Esta ruta funciona sea cual sea el método usado (GET, POST, PUT…).

Además de definir la acción a realizar para cada ruta, también es posible definir los pre-plugins y post-plugins a llamar.

<?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',
     ]
 ]
];
  • Línea 11: Definimos una ruta para la URL /article llamada en POST.
    • Línea 12: Se llama a un pre-plugin para esta ruta.
    • Línea 13: Especificamos el controlador y la acción asociados a esta ruta.
    • Línea 14 a 17: Configuramos dos post-plugins que se ejecutarán para esta ruta. Si hay varios plugins, hay que crear una lista.
  • Línea 19: Definimos una ruta para la URL /article/, seguida de un parámetro entero (al que llamaremos id), llamada con el método PUT.
    • Línea 20 a 23: Hay dos pre-plugins para esta ruta.
    • Línea 24: Especificamos el controlador y la acción asociados a esta ruta.
    • Línea 25: Hay un post-plugin para esta ruta.