14

我知道使用{% render() %}自动强制发送一个新的请求对象,但我很好奇是否有办法将原始请求作为参数传递?

{% render('some_action', {'originalRequest': app.request}) %}

这似乎对控制器没有任何作用:

public function actionAction($originalRequest = null) 
{
    // $originalRequest ends up just being null
}

我假设它是因为路线的设置方式:

some_action:
    pattern: /stuff/
    defaults: { _controller:SomeApp:Controller:action }

我想像这样的数据显然不能与 URL 分开,所以某种方式将数据传递给可呈现的 URL,有什么办法吗?

编辑(解决方案)

从长远来看,解决方案非常简单,正如下面的 Petre Pătraşc 所展示的,在 Twig 中,我需要做的就是直接调用控制器,通过这种方法,我可以传入对象(例如请求对象)和数组, 而不是 URL 中的文本值。
要在控制器中执行大致相同的想法,利用forward()路由器中的方法,将允许类似的效果,而无需将用户重定向到另一个页面。

4

3 回答 3

8

如果我理解正确,您正在寻找这个:

{% render "MyBundle:Controller:someAction" with { 'originalRequest' : app.request } %}
于 2013-10-11T21:00:35.963 回答
7

结果使用渲染函数

{{ render(controller('MyBundle:ControllerName:example', {'originalRequest': app.request})) }}

然后在你的控制器中

public function exampleAction(Request $originalRequest)
{
    // do something
}
于 2015-05-07T11:40:23.943 回答
-1

从 Symfony 2.4 开始,您可以通过 request_stack 访问原始请求。这避免了创建新方法参数的需要。

function exampleAction() {
  $request = $this->get('request_stack')->getMasterRequest();
  //do something
}

小心使用它,因为它会使您的子请求与 ESI/反向代理不兼容(其中子请求也是主请求)http://symfony.com/blog/new-in-symfony-2-4-the-请求栈

于 2016-05-31T15:56:21.460 回答