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)
您可以创建容器类并在两个控制器中使用它
在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)
在传递方法中做:
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)