简短版本:我,最终用户程序员,在使用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
的价值是代码——它是一种基于(但不完全相同?(twig模板语言语法的Symfony域特定语言(DSL(。 Symfony文档将其称为"表达式语法"。
我已经能够从文档中收集到这么多。 我无法弄清楚的是,使用此DSL可以访问哪个对象? 即,在上面的示例中,表达式似乎可以访问context
对象和request
对象。
还有其他人吗? 源代码中是否有文档或位置,我可以在其中查看我可以使用condition
访问的其他对象?
您链接的文档指出表达式中只有这两个对象可用:
您可以通过利用 传递到表达式中的两个变量:
context -
RequestContext
的一个实例,它包含有关要匹配的路由的最基本信息。request - Symfony
Request
对象(参见请求(。
(强调我的(。
您可以在SymfonyComponentRoutingMatcherUrlMatcher::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
的数组。