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

时间:2012-12-07 15:27:23

标签: php zend-framework2 zend-framework-mvc zend-framework-routing

我在 Foo 控制器中有一个需要参数的Action方法:

public function fooAction($one, $two) {
    $a = one;
    $b = $two;
}

我需要从某些 Boo 控制器的其他方法转发到该方法。其中一个参数必须是参考参数。 the manual唯一的例子是:

$result = $this->forward()->dispatch('Boo\Controller\Boo', array('action' => 'boo'));

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

  

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

所以,我试过了:

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

但它不起作用。

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

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,
                                                     )));

UPD 2:

我仍然无法获得我想要的功能(使用forward插件传递参数),但我找到了其他解决方案。在调用forward插件之前,我将变量设置为Request对象,forward之后我从 boo 操作中的Request获取变量我的 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;

愚蠢的解决方案,它不适用于Ajax请求。仍然有兴趣如何使用前向插件传递参数。或者可以如何在 booAction 中获取它们。因为如果我使用Request传递它们,forward中没有任何内容。

UPD 3和决赛:

我终于找到了他们决定隐藏我使用forward插件传递的参数的地方。他们将它们放在RouteMatch对象中。

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

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

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

中执行此操作
$param = $this->getEvent()->getRouteMatch()->getParam('nameOfParam');

5 个答案:

答案 0 :(得分: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 [];
}

答案 1 :(得分:7)

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

在module.conf中

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

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

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

并使用以下方式调用它:

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

使用前向

传递变量的ZF2方式

在传递方法中执行:

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

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

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

答案 2 :(得分:2)

以为我会添加另一个适合我的选项。

您可以直接将params传递给forward函数,并使用routeMatch函数在另一端访问它们。

return $this->forward()
            ->dispatch('Module\Controller\Foo', array(
                                            'action' => 'bas', 
                                             'id' => 6)
                                              );

通过 Foo 控制器, basAction 在此方法中,您可以使用以下代码访问id参数

$myParam = (int) $this->getEvent()->getRouteMatch()->getParam('id');

不确定这是否符合您的要求 - 但对我有用。

答案 3 :(得分:1)

感谢您提出这个问题,帮了我很多忙。找到一种简单的方法可以将所有参数传递给forward() - > dispatch(...)。在控制器的动作方法中:

$params = $this->params()->fromRoute();

返回数组$ data作为$ data传递到forward() - > dispatch($ controllerName,$ data)。

答案 4 :(得分:1)

Here in the official ZF2 documentation正是如何写的:

$params是一个可选参数数组,用于为此特定请求设置种子RouteMatch对象。这意味着参数将通过配置中的路由标识符的键来匹配(否则将忽略不匹配的键)

所以传递这样:

$params = array(
    'foo' => 'foo',
    'bar' => 'bar'
);
$this->forward()->dispatch('My\Controller', $params)

然后你可以像My\Controller一样在正常情况下获得你的路线匹配参数:

$foo = $this->params()->fromRoute('foo');
$bar = $this->params()->fromRoute('bar');

对于那些在控制器中访问参数的人来说,这里有一个很好的概述 this CheatSheet

$this->params()->fromPost('foo');  //POST
$this->params()->fromQuery('foo'); //GET
$this->params()->fromRoute('foo'); //RouteMatch
$this->params()->fromHeader('foo');//Header
$this->params()->fromFiles('foo'); //Uploaded file