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.