Saltar al contenido
TubePress — gratuito, autoalojado & con mantenimiento activo
Referencia para desarrolladores

Enrutamiento

La API del enrutador de TubePress: cómo se registran, asocian y despachan las rutas del front-end, de administración y de la API, incluidos los parámetros de ruta y los métodos HTTP.

TubePress utiliza un enrutador pequeño y rápido construido alrededor de la clase estática Router. Los controladores registran sus rutas en un método ::routes(), y public/index.php llama a esos métodos antes de despachar la solicitud. Esta página cubre todo lo que necesitas para añadir rutas desde un plugin o entender cómo se emparejan las solicitudes.

Registrar rutas

Registra una ruta con Router::get() o Router::post(). El manejador puede ser cualquier callable: una closure o un par [Class, 'method'].

// Closure handler
Router::get('/promo', function () {
    ThemeRenderer::render('promo', ['deal' => 'Summer']);
});

// Controller handler
Router::post('/promo/claim', [PromoController::class, 'claim']);

Por convención, cada controlador expone un método estático routes() que registra todas sus rutas, y ese método se llama una vez al inicio:

class PromoController
{
    public static function routes(): void
    {
        Router::get('/promo', [self::class, 'show']);
        Router::post('/promo/claim', [self::class, 'claim']);
    }
}

Parámetros de ruta

Usa marcadores de posición {name} en la ruta; cada uno coincide con un único segmento de URL (todo excepto /). Lee el valor con Router::param().

Router::get('/promo/{code}', function () {
    $code = Router::param('code');          // required
    $ref  = Router::param('ref', 'direct'); // with a default
    // …
});

Internamente, un patrón como /promo/{code} se compila a la expresión regular (?P<code>[^/]+), por lo que los parámetros nunca abarcan barras. Las rutas exactas se emparejan primero, luego las parametrizadas en orden de registro.

Enviar una respuesta

MétodoUso
ThemeRenderer::render($tpl, $data)Renderiza una página de front-end a través del tema activo.
Router::render($tpl, $data)Renderiza una plantilla de administración (templates/{$tpl}.php).
Router::json($data, $code = 200)Envía una respuesta JSON y termina.
Router::redirect($url)Redirige (y termina). Las URLs de front-end se prefijan automáticamente con el idioma/tipo activo.

Orden de rutas y la captura total

Las páginas estáticas son servidas por una captura total /{slug}, por lo que el controlador de páginas se registra al último en public/index.php — después de todas las demás rutas de front-end, administración y API. Si registras rutas desde un plugin durante el inicio, se añaden antes de la captura total y coincidirán primero.

Evita conflictos con un slug de página. Una ruta de plugin como /deals ocultará una página estática en /deals. Usa espacios de nombres en las rutas de plugin (por ejemplo /promo/deals) para estar seguro.

Protección CSRF

Cada POST que modifique el estado debe estar protegido con CSRF. El enrutador proporciona los siguientes helpers:

// In your form template
<?= Router::csrfField() ?>          // hidden input

// In your POST handler
if (!Router::verifyCsrf()) {
    Router::json(['error' => 'Invalid token'], 403);
}

verifyCsrf() acepta el token del campo POST csrf_token o del encabezado X-CSRF-Token, y lo compara con hash_equals().

URLs localizadas y tipadas

Para sitios multilingüe, el enrutador gestiona de forma transparente un prefijo de idioma (por ejemplo /fr/…) y traduce los slugs de ruta conocidos, de modo que /categorie/brunette se resuelve en la ruta category. Las rutas de administración e instalación están exentas: registra una ruta con Router::addNoPrefixPath() si necesitas excluir una ruta personalizada del prefijado. Consulta Idiomas y traducción para el comportamiento completo. Los helpers Router::langPrefix(), Router::typePrefix() y Router::url() te permiten construir enlaces correctos en cualquier localización.

Próximos pasos

¿Todavía con dudas?

Abre un ticket desde tu panel y nuestro equipo te ayudará.

Prueba la demo en vivo → Descargar TubePress →