从 Symfony 请求中获取路由并将其传递给包含的 twig 文件?

Posted

技术标签:

【中文标题】从 Symfony 请求中获取路由并将其传递给包含的 twig 文件?【英文标题】:Getting the route from a Symfony request and passing it to an included twig file? 【发布时间】:2021-07-13 10:38:57 【问题描述】:

我希望从我的 twig 模板中包含的文件中访问在我的控制器中生成的 $route 变量,但经过多次尝试我没有这样做。

我在控制器上定义 $route 变量是这样的:

$route = $request->attributes->get('_route');

然后我将变量发送到我的树枝模板

return $this->render('destinations/index.html.twig', [
            'route' => $route,
            'locale' => $locale,
            'langs' => $langs,
            'menu' => $menu
        ]);

从 base.html.twig 我调用 navbar.html.twig

 include('shared/navbar.html.twig') 

当我尝试从 navbar.html.twig 中打印 route 时,我收到一个 symfony 错误,指出路由变量不存在。

另外,如果我从 base.html.twig 尝试 app.request.attributes.get('_route') 我会得到路线,但如果我从 shared/navbar.html.twig 这样做,我会得到“空值”。为什么会这样?

【问题讨论】:

宏里面的include是偶然的吗? 对不起,宏是什么意思?我将它们包含在 base.html.twig 见here,因为这可能是问题 传递给模板的变量将不可用于父模板。这就解释了为什么 base.html.twig 和你的 navbar.html.twig 都不能访问路由。但是,每个模板都可以访问 app.request,因此 app.request.attributes.get('_route') 在 navbar.html.twig 中应该可以正常工作。我只是做了一个快速测试并确认了它。您可能在尝试时犯了语法错误。所以再试一次并保持简单。假设您没有使用嵌入式控制器,您可能应该使用它,那么它应该可以工作。 @Cerad OP 正在将模板从父级传递到包含的模板,还是我在这里误读了?他有index,它从base 延伸,在base OP 中有包含 【参考方案1】:

如果您的来自shared/navbar.html.twig 的控制器是从render(controller()) 调用的,请尝试以下方式:

public function yourAction(Request $request)

    $mainRequest = $this->get('request_stack')->getMasterRequest();
    $route = $mainRequest->get('_route');
    
    // stufff
    return $this->render('destinations/index.html.twig', [
        'route' => $route,
        'locale' => $locale,
        'langs' => $langs,
        'menu' => $menu
    ]);


然后转储route

【讨论】:

问题是我可以在 index.html.twig 和 base.html.twig 文件中转储路由,但在 navbar.html.twig 文件中转储路由会出错。 如果使用render_esirender(controller()) 调用导航栏块,则可以解释为对象请求与您的操作控制器之一不同。这就是为什么在这种情况下我建议你使用getMasterRequest() :)。也许不是你的情况,所以我的回答与你的问题不符,但把它放在某个地方,也许以后会有用;)。【参考方案2】:

根据docs 包含的模板应该可以访问活动上下文的变量。您还可以通过在 with 关键字之后传递其他变量来添加它们。尝试像这样传递值:

% set vars = 'route': app.request.attributes.get('_route') %
% include 'shared/navbar.html.twig' with vars %

【讨论】:

【参考方案3】:

已解决,我感到很尴尬,但我提供了最终答案。提供 $menu 数组的函数是通过 $this->render 返回模板,而不是返回它应该返回的数组,因此所有的混乱。感谢大家的意见,这让我能够在尝试不同问题的同时浏览代码。谢谢

【讨论】:

以上是关于从 Symfony 请求中获取路由并将其传递给包含的 twig 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Vert.x的路由器

从数据表中获取值并将其传递给标签

如何从 cookie 中保存 XSRF 令牌并将其传递给 Gatling 的下一个请求标头中的服务器

如何从文本字段中获取值并将其传递给变量?

从输入字段中获取一个值并将其传递给 Paypal

邮递员:如何从 html 响应中提取值并将其传递给邮递员中的下一个请求