ZF2: How to pass parameters to forward plugin which I can then get in the method I forward them to?

php, zend-framework-mvc, zend-framework-routing, zend-framework2

Solution

You can create a container class and use it in both controllers

in module.conf

public function getServiceConfig()
{
    return array(
        'invokables' => array(
            'my_handy_container'        => 'path\container_class_name',
        )
    );
}

Create a getter in both controllers:

public function getMyHandyContainer()
{
    if (!$this->myHandyContainer) {
        $this->myHandyContainer = $this->getServiceLocator()->get('my_handy_container');
    }
    return $this->myHandyContainer;
}

And call it using:

$myContainer = $this->getMyHandyContainer()->myHandyContainer;
$myContainer->foo = 5; // set something

ZF2 way to pass vars using forward

In the passing method do:

return $this->forward()->dispatch('controller_name', [
    'action' => 'whatever',
    'varname' => $value,
    'varname2' => $value2
]);

In the invoked controller method, do:

$param2 = $this->params()->fromRoute('varname2',false);

Problem

I have an Action method in Foo Controller which requires parameters: ``` public function fooAction($one, $two) { $a = one; $b = $two; } ``` And I need to forward to that method from the other method of some Boo Controller. And one of those parameters has to be by reference parameter. The only example that the manual has is this: ``` $result = $this->forward()->dispatch('Boo\Controller\Boo', array('action' => 'boo')); ``` No any additional parameters. But they write: $params is an optional array of parameters with which to see a RouteMatch object for purposes of this specific request. So, I tried: ``` $result = $this->forward()->dispatch('Boo\Controller\Boo', array( 'action' => 'boo', 'one' => &$one, 'two' => $two, )); ``` But it doesn't work. Is there any way to pass additional parameters to forward controller? UPD: These do not work too: ``` $result = $this->forward()->dispatch('Boo\Controller\Boo', array( 'action' => 'boo', 'params' => array( 'one' => &$one, 'two' => $two, ))); $result = $this->forward()->dispatch('Boo\Controller\Boo', array( 'action' => 'boo', 'options' => array( 'one' => &$one, 'two' => $two, ))); ``` UPD 2: I still can't get the functionality I want (to pass parameters with the `forward` plugin) but I found other solutions. Before calling the `forward` plugin I set the variables to the `Request` object and after the `forward` I get them from the `Request` in my boo Action of my Boo\Controller\BooController: ``` // in Foo::fooAction $this->getRequest()->one = &$one; $this->getRequest()->two = $two; $result = $this->forward()->dispatch('Boo\Controller\Boo', array('action' => 'boo')); // in Boo::booAction $a = $this->getRequest()->one; $b = $this->getRequest()->two; ``` Stupid solution, it will not work with Ajax requests. Still interested how to pass parameters with the forward plugin. OR MAYBE how to get them in the booAction. Because there in no anything in the `Request` if I pass them with the `forward`. UPD 3 and Final: I finally found where they've decided to hide parameters I pass with the `forward` plugin. They put them in the `RouteMatch` object. - Tryyyy to guess where we've hidden your params... Oh yeeah, they are in the `RouteMatch`, of course they are there, didn't you think smth else? And NO ANY info in the `forward` plugin section of the manual! To get params, I have to do this in my `BooController::booAction`: ``` $param = $this->getEvent()->getRouteMatch()->getParam('nameOfParam'); ```

Original source