Php ZF2:如何将参数传递给forward插件,然后我可以在方法中获得这些参数?

Php ZF2:如何将参数传递给forward插件,然后我可以在方法中获得这些参数?,php,zend-framework2,zend-framework-mvc,zend-framework-routing,Php,Zend Framework2,Zend Framework Mvc,Zend Framework Routing,我在Foo控制器中有一个动作方法,需要参数: public function fooAction($one, $two) { $a = one; $b = $two; } 我需要从某个Boo控制器的另一个方法转到该方法。其中一个参数必须是引用参数。唯一的例子是: $result = $this->forward()->dispatch('Boo\Controller\Boo', array('action' => 'boo')); 没有任何附加参数。但他们写

我在Foo控制器中有一个动作方法,需要参数:

public function fooAction($one, $two) {
    $a = one;
    $b = $two;
}
我需要从某个Boo控制器的另一个方法转到该方法。其中一个参数必须是引用参数。唯一的例子是:

$result = $this->forward()->dispatch('Boo\Controller\Boo', array('action' => 'boo'));
没有任何附加参数。但他们写道:

$params是一个可选的参数数组,用于查看 用于此特定请求的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
插件之前,我将变量设置为
Request
对象,在
forward
之后,我从我的boo\Controller\BooController操作中的
Request
获取变量:

// 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请求。仍然对如何使用forward插件传递参数感兴趣。或者如何让他们进入booAction。因为如果我用
向前传递
请求,则在
请求中没有任何内容

UPD 3和最终版本:

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

-试着猜猜我们把你的情人藏在哪里了。。。哦,是的,它们在
路径匹配中,当然在那里,你不觉得还有其他的吗

手册的
转发
插件部分没有任何信息

要获取参数,我必须在我的
BooController::booAction
中执行此操作:

$param = $this->getEvent()->getRouteMatch()->getParam('nameOfParam');

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

在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使用forward传递VAR的方法 在传递方法中,请执行以下操作:

return $this->forward()->dispatch('controller_name', [
    'action' => 'whatever',
    'varname' => $value,
    'varname2' => $value2
]);
在调用的控制器方法中,执行以下操作:

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

为什么不使用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 [];
}

谢谢你的提问,帮了我很多忙。找到了一种将所有参数传递给forward()->dispatch(…)的简单方法。在控制器的操作方法中:

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

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

我想我会添加另一个适合我的选项

您只需直接通过forward函数传递参数,然后使用routeMatch函数在另一端访问它们

return $this->forward()
            ->dispatch('Module\Controller\Foo', array(
                                            'action' => 'bas', 
                                             'id' => 6)
                                              );
传递给Foo控制器,basAction在这种方法中,您可以使用以下代码访问id参数

$myParam = (int) $this->getEvent()->getRouteMatch()->getParam('id');
不确定这是否符合您的要求-但对我来说很有效

就是这样写的:

$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->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

Boo
是有效的控制器别名吗?正如文档所指出的那样,
Boo
需要是一个完全限定的类名(例如
Mymodule\Controller\BooController
),或者它应该是您在配置中定义的该控制器的别名是的,它是一个完全限定的类名,它是
“Boo\Controller\Boo”
。我在问题中这样写是为了缩短它。现在更改以避免模糊。这仍然只是一个别名。可以安全地假设您已从
Boo\Controller\Boo
=>
Boo\Controller\BooController
设置了可调用别名?除此之外,您的第一种方法是正确的。如何测试参数是否存在?它们是否也在路由配置中定义?Tihs blogpost使用了您一直在寻找的功能: