Symfony路由条件DSL上下文

时间:2019-03-26 15:49:07

标签: php symfony dsl symfony-routing

简短版本:最终用户程序员我在使用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访问的其他对象?

1 个答案:

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