简短版本:最终用户程序员我在使用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
的值是代码-它是基于树枝模板语言语法(但不完全相同)的Symfony域特定语言(DSL)。 Symfony docs refer to this as "The Expression Syntax"。
我已经能够从文档中收集到很多东西。我不知道使用此DSL可以访问哪些对象?也就是说,在上面的示例中,表达式似乎可以访问context
对象和request
对象。
还有其他人吗?在源代码中是否有文档或地方可以查看我可以使用condition
访问的其他对象?
答案 0 :(得分:1)
documentation you are linking声明表达式中仅以下两个对象可用:
您可以利用表达式来执行表达式中需要的任何复杂逻辑 两个传递到表达式中的变量:
上下文-
RequestContext
的实例,其中包含有关要匹配的路由的最基本信息。request-Symfony
Request
对象(请参阅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
的数组。