Roteamento


1Roteamento básico

O roteamento básico do Temma é intencionalmente muito simples.

Por padrão, as URLs são mapeadas para os nomes dos controladores.

Ao acessar www.site.com/article/show/123/title
o Temma executa o código Article::show(123, 'title')
e usa o template article/show.tpl

As rotas servem para definir "controladores virtuais", que funcionam como aliases para controladores reais. Isso é particularmente útil para permitir o acesso a controladores por meio de nomes de arquivo (como os clássicos robots.txt e sitemap.xml).

Isso também possibilita ter um mesmo controlador que responde em várias URLs diferentes, eventualmente realizando processamentos distintos conforme o nome do controlador solicitado.

Exemplo:

<?php

return [
    'routes' => [
        'article'              => 'Posts',
        'sitemap.xml'          => '\App\Controllers\Sitemap',
        'sitemap.extended.xml' => '\App\Controllers\ExtendedSitemap',
    ]
];
  • Linha 4: Definição das rotas.
  • Linha 5: Definição do controlador virtual article, que é um alias do controlador Posts.
    Por exemplo, uma chamada à URL http://www.site.com/article/list chamará o método list() do objeto Posts.
  • Linha 6: Garantimos que uma chamada à URL http://www.site.com/sitemap.xml resulte na execução do método __invoke() do controlador \App\Controllers\Sitemap.
  • Linha 7: Garantimos que uma chamada à URL http://www.site.com/sitemap.extended.xml resulte na execução do método __invoke() do controlador \App\Controllers\ExtendedSitemap.

2Roteamento avançado

O plugin \Temma\Plugins\Router permite ativar um roteamento mais elaborado.

Ele precisa ser ativado no arquivo etc/temma.php como pré-plugin, e usa uma configuração estendida para definir quais controladores/ações executar de acordo com a URL chamada.

Os objetos a serem chamados como controladores devem começar com o caractere barra invertida (\), mesmo que estejam no namespace global.
Se uma URL não estiver definida na configuração do plugin, o Temma usará os valores definidos na configuração geral (em particular as diretivas rootController e defaultController). A diretiva proxyController sempre tem precedência.

<?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)',
 ]
];
  • Linha 6: O objeto \Temma\Plugins\Router é definido como pré-plugin. Ele assume assim o controle e poderá modificar os plugins, o controlador e a ação que serão executados pelo framework.
  • Linha 9: Configuração estendida específica do roteador avançado.
  • Linha 10: Definimos que, para a URL /articles chamada em GET, é necessário executar o método list() do objeto \MyApp\Ctrl\Cms.
  • Linha 11: Definimos que uma chamada GET à URL /articles/ pode ser seguida de um parâmetro (que chamaremos de sort) que só pode conter os valores alpha ou date. Nesse caso, o Temma terá que executar o método list() do objeto \MyApp\Ctrl\Cms, passando a ele o valor sort como parâmetro.
  • Linha 12: Uma chamada GET à URL /articles/ também pode receber dois parâmetros. O primeiro é um tipo de ordenação (como visto acima), o segundo é um número de página. O método list() é então chamado, com o tipo de ordenação como primeiro parâmetro, o número de página como segundo parâmetro, e uma string fixa como terceiro parâmetro.
  • Linha 13: Definimos que, para a URL /article/, seguida de um parâmetro inteiro (que será chamado de id) e de um parâmetro de texto (chamado title), o Temma deve executar o método show() do objeto \MyApp\Ctrl\Cms, fornecendo a ele os valores id e title recuperados da URL como parâmetros. Essa rota funciona independentemente do método usado (GET, POST, PUT…).

Além de definir a ação a ser executada para cada rota, também é possível definir os pré-plugins e pós-plugins a serem chamados.

<?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',
     ]
 ]
];
  • Linha 11: Definimos uma rota para a URL /article chamada em POST.
    • Linha 12: Um pré-plugin é chamado para essa rota.
    • Linha 13: Especificamos o controlador e a ação associados a essa rota.
    • Linhas 14 a 17: Configuramos dois pós-plugins para executar nessa rota. Se houver vários plugins, é preciso criar uma lista.
  • Linha 19: Definimos uma rota para a URL /article/, seguida de um parâmetro inteiro (que chamaremos de id), chamada com o método PUT.
    • Linhas 20 a 23: Há dois pré-plugins para essa rota.
    • Linha 24: Especificamos o controlador e a ação associados a essa rota.
    • Linha 25: Há um pós-plugin para essa rota.