Symfony 路由条件 DSL 上下文
Symfony Route Conditions DSL Context
简短版本:当使用 Symfony 的路由条件时,最终用户程序员可以访问哪些对象?
长版:Symfony 路由允许您使用 a key named condition
。
contact:
path: /contact
controller: 'App\Controller\DefaultController::contact'
condition: "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'"
condition
的值是代码——它是一种基于(但不完全相同?)twig 模板语言语法的 Symfony 域特定语言 (DSL)。 Symfony docs refer to this as "The Expression Syntax".
我已经能够从文档中收集到这么多信息。我想不通的是我可以使用这个 DSL 访问什么对象?即在上面的示例中,表达式似乎可以访问 context
对象和 request
对象。
还有其他的吗?源代码中是否有文档或某个位置可以让我看到我可以使用 condition
访问哪些其他对象?
documentation you are linking 指出表达式中只有这两个对象可用:
You can do any complex logic you need in the expression by leveraging
two variables that are passed into the expression:
context - An instance of RequestContext
, which holds the most fundamental information about the route being matched.
request - The Symfony Request
object (see Request).
(强调我的)。
您可以在 Symfony\Component\Routing\Matcher\UrlMatcher::handleRouteRequirements()
上看到这些对象被注入到表达式中的位置:
protected function handleRouteRequirements($pathinfo, $name, Route $route)
{
// expression condition
if ($route->getCondition() && !$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
的数组。
简短版本:当使用 Symfony 的路由条件时,最终用户程序员可以访问哪些对象?
长版:Symfony 路由允许您使用 a key named condition
。
contact:
path: /contact
controller: 'App\Controller\DefaultController::contact'
condition: "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'"
condition
的值是代码——它是一种基于(但不完全相同?)twig 模板语言语法的 Symfony 域特定语言 (DSL)。 Symfony docs refer to this as "The Expression Syntax".
我已经能够从文档中收集到这么多信息。我想不通的是我可以使用这个 DSL 访问什么对象?即在上面的示例中,表达式似乎可以访问 context
对象和 request
对象。
还有其他的吗?源代码中是否有文档或某个位置可以让我看到我可以使用 condition
访问哪些其他对象?
documentation you are linking 指出表达式中只有这两个对象可用:
You can do any complex logic you need in the expression by leveraging two variables that are passed into the expression:
context - An instance of
RequestContext
, which holds the most fundamental information about the route being matched.request - The Symfony
Request
object (see Request).
(强调我的)。
您可以在 Symfony\Component\Routing\Matcher\UrlMatcher::handleRouteRequirements()
上看到这些对象被注入到表达式中的位置:
protected function handleRouteRequirements($pathinfo, $name, Route $route)
{
// expression condition
if ($route->getCondition() && !$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
的数组。