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 的数组。