Ir para o conteúdo
TubePress — gratuito, auto-hospedado & ativamente mantido
Referência para desenvolvedores

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étodoUso
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.

Evite conflitos com um slug de página. Uma rota de plugin como /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.

Experimente o demo ao vivo → Baixar TubePress →