Как ограничить сопоставление маршрутов с помощью условий

Как ограничить сопоставление маршрутов с помощью условий

Маршрут может быть создан так, чтобы совпадать только с определенными маршрутными заполнителями (с помощью обычных выражений), HTTP-методами, или именами хостов. Если вам нужно больше гибкости в определении логики произвольного совпадения, используйте опцию маршрутизации conditions:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/routes.yaml
contact:
    path:       /contact
    controller: 'App\Controller\DefaultController::contact'
    condition:  "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'"

Сondition - это выражение, и вы можете узнать больше о его синтаксисе здесь . С ним маршрут не будет совпадать, кроме случаев, когда HTTP-метод является GET или HEAD и если заголовок User-Agent соответствует firefox.

Вы можете создавать в выражении логику такой сложности, как вам нужно, используя две переменные, которые передаются в выражение:

context
Экземпляр класса RequestContext, который содержит самую фундаментальную информацию о соответствующем маршруте.
request
Объект Symfony Request (см. Компонент HttpFoundation).

Caution

Условия не берутся в расчёт при генерировании URL.

Ха кулисами, выражения компилираются в сырой PHP. Наш пример сгенерирует следующий PHP в каталоге кеша:

1
2
3
4
5
6
if (rtrim($pathinfo, '/contact') === '' && (
    in_array($context->getMethod(), array(0 => "GET", 1 => "HEAD"))
    && preg_match("/firefox/i", $request->headers->get("User-Agent"))
)) {
    // ...
}

Благодаря этому, использование ключа condition не создаёт дополнительных издержек, кроме времени, которое требуется для выполнения базового PHP.