Маршрутизация
API маршрутизатора TubePress: как регистрируются, сопоставляются и обрабатываются маршруты фронтенда, админки и API, включая параметры маршрутов и HTTP-методы.
TubePress использует небольшой и быстрый маршрутизатор, основанный на статическом классе Router. Контроллеры регистрируют свои маршруты в методе ::routes(), а public/index.php вызывает эти методы перед диспетчеризацией запроса. Эта страница охватывает всё необходимое для добавления маршрутов из плагина или понимания того, как сопоставляются запросы.
Регистрация маршрутов
Зарегистрируйте маршрут с помощью Router::get() или Router::post(). Обработчик — любой вызываемый объект: замыкание или пара [Class, 'method'].
// Closure handler
Router::get('/promo', function () {
ThemeRenderer::render('promo', ['deal' => 'Summer']);
});
// Controller handler
Router::post('/promo/claim', [PromoController::class, 'claim']);По соглашению каждый контроллер предоставляет статический метод routes(), который регистрирует все его маршруты, и этот метод вызывается один раз при запуске:
class PromoController
{
public static function routes(): void
{
Router::get('/promo', [self::class, 'show']);
Router::post('/promo/claim', [self::class, 'claim']);
}
}Параметры маршрута
Используйте заполнители {name} в пути; каждый соответствует одному сегменту URL (всему, кроме /). Читайте значение с помощью Router::param().
Router::get('/promo/{code}', function () {
$code = Router::param('code'); // required
$ref = Router::param('ref', 'direct'); // with a default
// …
});Внутри шаблон вида /promo/{code} компилируется в регулярное выражение (?P<code>[^/]+), поэтому параметры никогда не охватывают слэши. Сначала сопоставляются точные маршруты, затем параметризованные — в порядке регистрации.
Отправка ответа
| Метод | Использование |
|---|---|
ThemeRenderer::render($tpl, $data) | Отобразить страницу на стороне клиента через активную тему. |
Router::render($tpl, $data) | Отобразить шаблон администратора (templates/{$tpl}.php). |
Router::json($data, $code = 200) | Отправить JSON-ответ и завершить выполнение. |
Router::redirect($url) | Перенаправить (и завершить выполнение). Клиентские URL автоматически дополняются префиксом активного языка/типа. |
Порядок маршрутов и перехватчик
Статические страницы обслуживаются перехватчиком /{slug}, поэтому контроллер страниц регистрируется последним в public/index.php — после всех остальных клиентских, административных и API-маршрутов. Если вы регистрируете маршруты из плагина при запуске, они добавляются до перехватчика и будут сопоставлены первыми.
/deals, перекроет статическую страницу по адресу /deals. Используйте пространства имён для маршрутов плагина (например, /promo/deals), чтобы избежать конфликтов.Защита от CSRF
Каждый POST-запрос, изменяющий состояние, должен быть защищён от CSRF. Маршрутизатор предоставляет вспомогательные функции:
// In your form template
<?= Router::csrfField() ?> // hidden input
// In your POST handler
if (!Router::verifyCsrf()) {
Router::json(['error' => 'Invalid token'], 403);
}verifyCsrf() принимает токен из поля POST csrf_token или заголовка X-CSRF-Token и сравнивает его с помощью hash_equals().
Локализованные и типизированные URL
Для многоязычных сайтов маршрутизатор прозрачно обрабатывает языковой префикс (например, /fr/…) и переводит известные слаги маршрутов, так что /categorie/brunette соответствует маршруту category. Административные маршруты и маршруты установки исключены — зарегистрируйте путь с помощью Router::addNoPrefixPath(), если вам нужно исключить пользовательский путь из добавления префикса. Полное поведение описано в разделе Языки и перевод. Вспомогательные функции Router::langPrefix(), Router::typePrefix() и Router::url() позволяют создавать корректные ссылки для любого языка.
Следующие шаги
Остались вопросы?
Откройте заявку в панели управления, и наша команда поможет.