我在 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');
答案 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
在传递方法中执行:
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