Roteamento
A API do Router do TubePress: como as rotas de front-end, administração e API são registradas, correspondidas e despachadas, incluindo parâmetros de rota e métodos HTTP.
O TubePress utiliza um roteador pequeno e rápido construído em torno da classe estática Router. Os controladores registram suas rotas em um método ::routes(), e o public/index.php chama esses métodos antes de despachar a requisição. Esta página cobre tudo o que você precisa para adicionar rotas a partir de um plugin ou entender como as requisições são correspondidas.
Registrando rotas
Registre uma rota com Router::get() ou Router::post(). O handler pode ser qualquer callable — uma closure ou um par [Class, 'method'].
// Closure handler
Router::get('/promo', function () {
ThemeRenderer::render('promo', ['deal' => 'Summer']);
});
// Controller handler
Router::post('/promo/claim', [PromoController::class, 'claim']);Por convenção, cada controlador expõe um método estático routes() que registra todas as suas rotas, e esse método é chamado uma vez na inicialização:
class PromoController
{
public static function routes(): void
{
Router::get('/promo', [self::class, 'show']);
Router::post('/promo/claim', [self::class, 'claim']);
}
}Parâmetros de rota
Use marcadores {name} no caminho; cada um corresponde a um único segmento da URL (tudo exceto /). Leia o valor com Router::param().
Router::get('/promo/{code}', function () {
$code = Router::param('code'); // required
$ref = Router::param('ref', 'direct'); // with a default
// …
});Internamente, um padrão como /promo/{code} é compilado para a regex (?P<code>[^/]+), portanto os parâmetros nunca abrangem barras. Rotas exatas são correspondidas primeiro, depois as parametrizadas na ordem de registro.
Enviando uma resposta
| Método | Uso |
|---|---|
ThemeRenderer::render($tpl, $data) | Renderiza uma página front-end através do tema ativo. |
Router::render($tpl, $data) | Renderiza um template administrativo (templates/{$tpl}.php). |
Router::json($data, $code = 200) | Envia uma resposta JSON e encerra. |
Router::redirect($url) | Redireciona (e encerra). URLs front-end são automaticamente prefixadas com o idioma/tipo ativo. |
Ordem das rotas e o catch-all
Páginas estáticas são servidas por um catch-all /{slug}, portanto o controlador de páginas é registrado por último em public/index.php — após todas as outras rotas front-end, administrativas e de API. Se você registrar rotas a partir de um plugin durante a inicialização, elas serão adicionadas antes do catch-all e serão correspondidas primeiro.
/deals irá sombrear uma página estática em /deals. Use namespace nas rotas do plugin (por exemplo /promo/deals) para maior segurança.Proteção CSRF
Todo POST que modifica estado deve ser protegido contra CSRF. O roteador fornece os helpers:
// In your form template
<?= Router::csrfField() ?> // hidden input
// In your POST handler
if (!Router::verifyCsrf()) {
Router::json(['error' => 'Invalid token'], 403);
}verifyCsrf() aceita o token do campo POST csrf_token ou do cabeçalho X-CSRF-Token, e os compara com hash_equals().
URLs localizadas e tipadas
Para sites multilíngues, o roteador lida de forma transparente com um prefixo de idioma (por exemplo /fr/…) e traduz slugs de rota conhecidos, de modo que /categorie/brunette é resolvido para a rota category. Rotas administrativas e de instalação são isentas — registre um caminho com Router::addNoPrefixPath() se precisar excluir um caminho personalizado do prefixo. Consulte Idiomas & tradução para o comportamento completo. Os helpers Router::langPrefix(), Router::typePrefix() e Router::url() permitem que você construa links corretos em qualquer localidade.
Próximos passos
Ainda com dúvidas?
Abra um ticket pelo painel e nossa equipe vai ajudá-lo.