ZF2:如何将参数传递给转发插件,然后我可以将它转发给我转发的方法?

Gre*_*een 7 php zend-framework-mvc zend-framework2 zend-framework-routing

我在Foo Controller中有一个Action方法,它需要参数:

public function fooAction($one, $two) {
    $a = one;
    $b = $two;
}
Run Code Online (Sandbox Code Playgroud)

我需要从一些Boo Controller 的其他方法转发到该方法.其中一个参数必须是参考参数.手册的唯一例子是:

$result = $this->forward()->dispatch('Boo\Controller\Boo', array('action' => 'boo'));
Run Code Online (Sandbox Code Playgroud)

没有任何其他参数.但他们写道:

$ params是一个可选的参数数组,用于查看此特定请求的RouteMatch对象.

所以,我尝试过:

$result = $this->forward()->dispatch('Boo\Controller\Boo', array(
                                                      'action' => 'boo',
                                                      'one' => &$one,
                                                      'two' => $two,
                                                 ));
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

有没有办法将其他参数传递给前向控制器?

UPD:

这些也不起作用:

$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,
                                                     )));
Run Code Online (Sandbox Code Playgroud)

UPD 2:

我仍然无法获得我想要的功能(使用forward插件传递参数),但我找到了其他解决方案.调用之前forward的插件我设置的变量的Request对象和之后forward我让他们从Request我的爱人我的行动嘘\控制器\ 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;
Run Code Online (Sandbox Code Playgroud)

愚蠢的解决方案,它不适用于Ajax请求.仍然有兴趣如何使用前向插件传递参数.或者可能如何让他们进入booAction.因为没有任何东西,Request如果我通过他们forward.

UPD 3和决赛:

我终于找到了他们决定隐藏我用forward插件传递的参数的地方.他们把它们放在RouteMatch物体里.

- Tryyyy猜测我们隐藏你的参数的地方......哦,是的,他们在RouteMatch,当然他们在那里,你不觉得其他吗?

并且forward手册的插件部分中没有任何信息!

要获得参数,我必须在我的BooController::booAction:

$param = $this->getEvent()->getRouteMatch()->getParam('nameOfParam');
Run Code Online (Sandbox Code Playgroud)

小智 11

为什么不使用params插件?

这对我有用:

public function indexAction() {

        $object = new SomeObject();

        return $this->forward()->dispatch('Application\Controller\Index', [
                'action'     => 'show',
                'myObject'   => $object,
        ]);
    }

public function showAction() {

        $object = $this->params('myObject');

        var_dump($object);

        return [];
}
Run Code Online (Sandbox Code Playgroud)


mic*_*lbn 7

您可以创建容器类并在两个控制器中使用它

在module.conf中

public function getServiceConfig()
{
    return array(
        'invokables' => array(
            'my_handy_container'        => 'path\container_class_name',
        )
    );
}
Run Code Online (Sandbox Code Playgroud)

在两个控制器中创建一个getter:

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

并使用以下方式调用:

$myContainer = $this->getMyHandyContainer()->myHandyContainer;
$myContainer->foo = 5; // set something
Run Code Online (Sandbox Code Playgroud)

ZF2使用forward传递vars的方法

在传递方法中做:

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

在调用的控制器方法中,执行:

$param2 = $this->params()->fromRoute('varname2',false);
Run Code Online (Sandbox Code Playgroud)