Условия маршрута Symfony Контекст DSL

#php #symfony #dsl #symfony-routing

#php #symfony #dsl #symfony-маршрутизация

Вопрос:

Краткая версия: к каким объектам у меня, конечного пользователя-программиста, есть доступ при использовании условий маршрутизации Symfony?

Длинная версия: Маршруты Symfony позволяют использовать ключ с именем condition .

 contact:
    path:       /contact
    controller: 'AppControllerDefaultController::contact'
    condition:  "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'"
  

Значением condition является code — это язык, специфичный для домена Symfony (DSL), основанный на (но не идентичный?) синтаксис языка шаблонов twig. Документы Symfony ссылаются на это как на «Синтаксис выражения».

Это все, что я смог почерпнуть из документации. Чего я не могу понять, так это к какому объекту у меня будет доступ, используя этот DSL? т.Е. в приведенном выше примере выражение, похоже, имеет доступ к context объекту и request object .

Есть ли другие? Есть ли документы или место в исходном коде, где я могу посмотреть, к каким другим объектам у меня был бы доступ condition ?

Ответ №1:

В документации, на которую вы ссылаетесь, указано, что в выражении доступны только эти два объекта:

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

context — экземпляр RequestContext , который содержит наиболее фундаментальную информацию о сопоставляемом маршруте.

запрос — объект Symfony Request (см. Запрос).

(Выделено мной).

Вы можете увидеть, где эти объекты вводятся в выражение на SymfonyComponentRoutingMatcherUrlMatcher::handleRouteRequirements() :

 protected function handleRouteRequirements($pathinfo, $name, Route $route)
{
    // expression condition
    if ($route->getCondition() amp;amp; !$this->getExpressionLanguage()->evaluate($route->getCondition(), ['context' => $this->context, 'request' => $this->request ?: $this->createRequest($pathinfo)])) {
        return [self::REQUIREMENT_MISMATCH, null];
    }

    return [self::REQUIREMENT_MATCH, null];
}
  

Вызов evaluate() передает как выражение, которое вы определили в condition ключе, так и массив с $context и $request .

Комментарии:

1. Спасибо @yivi! По какой-то причине я прочитал это как описание конкретного примера кода, а не как поведение системы в целом. Я полагаю, слишком много DSL 🙂