Symfony 2 Forward Request passing along GET/POST params

后端 未结 4 2089
醉酒成梦
醉酒成梦 2021-01-04 09:26

Is it possible to forward a request, passing along all GET/POST params?

I think if I just do

$this->forward(\'dest\')

I will g

相关标签:
4条回答
  • 2021-01-04 09:48

    Easiest solution (and one I'd probably go for) would be to just pass Request class as forward parameter

    public function indexAction()
    {
        $request = $this->getRequest();
    
        return $this->forward('AcmeBundle:Forward:new', array('request' => $request));
    }
    

    And in forwarded action just use it as method param:

    public function testAction($request)
    {
        var_dump($request);exit;
    }
    
    0 讨论(0)
  • 2021-01-04 09:53

    I don't see any reason here to forward the request back through the kernel. You can go the route of encapsulating this logic in a checker service, as you've suggested, or you may be able to create a kernel.request listener that runs after the router listener and applies the _controller attribute only if your conditions are met.

    For example, this routing.yml:

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

    And this listener:

    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');
            }
        }
    }
    

    Configured to run after the core router listener:

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

    The priority of the core router listener is 0 in Symfony 2.0 and 32 in Symfony 2.1. In either case, a priority of -10 should work.

    I'm curious to see if this works :)

    0 讨论(0)
  • 2021-01-04 09:56

    All POST param are automatically forwarded. No action is needed to have POST param in the target controller. But you have to explicitly pass query (GET) params and path params. The forward method take 2 optionals parameter representing respectively the pathParam and the queryParam arrays. You can just pass all the query param from the current request

    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);
    }
    
    0 讨论(0)
  • 2021-01-04 09:59

    Forwarding "request attributes" as "path" works for me:

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

    $path['_controller'] will be overwritten in forward() method!

    0 讨论(0)
提交回复
热议问题