Php ZF2:如何将参数传递给forward插件,然后我可以在方法中获得这些参数?
我在Foo控制器中有一个动作方法,需要参数: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')); 没有任何附加参数。但他们写
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使用了您一直在寻找的功能: