Symfony Route Conditions DSL Context



简短版本:我,最终用户程序员,在使用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 的数组。

最新更新