Symfony 2转发请求传递GET / POST参数

时间:2012-01-03 03:25:45

标签: php symfony forwarding

是否可以转发请求,传递所有GET / POST参数?

我想如果我做的话

$this->forward('dest')

我会在没有任何GET / POST参数的情况下前往dest吗?

更新

我的目标实际上是拥有像addSomething这样的控制器操作,它会检查用户是否有足够的“项目”来添加内容。然后将请求转发给approperiate控制器以继续实际添加{Type} Something

或者在所有进行检查的控制器中获得“检查”服务更合适?无论如何,我认为它有助于知道如何转发到所有参数的控制器动作

4 个答案:

答案 0 :(得分:28)

最简单的解决方案(我可能会选择一个)就是将Request类作为前向参数传递

public function indexAction()
{
    $request = $this->getRequest();

    return $this->forward('AcmeBundle:Forward:new', array('request' => $request));
}

在转发操作中,只需将其用作方法参数:

public function testAction($request)
{
    var_dump($request);exit;
}

答案 1 :(得分:15)

我认为没有任何理由通过内核转发请求。您可以按照建议的方式将此逻辑封装在检查器服务中,或者您可以创建一个在路由器侦听器之后运行的kernel.request侦听器,并仅应用_controller属性如果你的条件得到满足。

例如,这个routing.yml

some_route:
    pattern:  /xyz
    defaults: { _controller_candidate: "FooBundle:Bar:baz" }

这个听众:

class MyListener
{
    public function onKernelRequest($event)
    {
        $request = $event->getRequest();
        if (!$controller = $request->attributes->get('_controller_candidiate')) {
            return;
        }

        if (/* your logic... */) {
            $request->attributes->set('_controller', $controller');
        }
    }
}

配置为在核心路由器侦听器之后运行

services:
    my_listener:
        class: MyListener
        tags:
            -
                name:     kernel.event_listener
                event:    kernel.request
                priority: -10

核心路由器侦听器的优先级在Symfony 2.0中为0,在Symfony 2.1中为32。在任何一种情况下,-10的优先级都应该有效。

我很想知道这是否有效:)

答案 2 :(得分:11)

所有POST参数都会自动转发。在目标控制器中使用POST参数不需要任何操作。 但是你必须明确地传递查询(GET)参数和路径参数。 forward方法采用2个optionals参数分别表示pathParam和queryParam数组。您可以从当前请求传递所有查询参数

public testAction(Request $request){
    $pathParam = array(); //Specified path param if you have some
    $queryParam = $request->query->all(); 
    $response = $this->forward("AcmeBundle:Forward:new", $pathParam, $queryParam);
}

答案 3 :(得分:1)

转发“请求属性”作为“路径”对我有用:

public function indexAction()
{
    $path = $this->getRequest()->attributes->all();
    return $this->forward('CompMyBundle:MyController:MyAction', $path);
}

$ path ['_ controller']将在forward()方法中被覆盖!