#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 🙂