Перейти к содержимому
TubePress — бесплатный, самостоятельный & активно поддерживаемый
Справочник разработчика

Маршрутизация

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() позволяют создавать корректные ссылки для любого языка.

Следующие шаги

Остались вопросы?

Откройте заявку в панели управления, и наша команда поможет.

Попробовать демо → Скачать TubePress →