我的控制器构造中必须有 ServiceLocator ,但我不能。
在我的方法中,我可以使用DB params:
$this->getServiceLocator()
但是,此方法在我的__construct
中无效。
所以,我尝试在我的 Module.php 中添加它,但它看起来不起作用:
public function getControllerConfig() {
return array(
'factories' => array(
'validechoixoptions' => function(ControllerManager $cm) {
$sm = $cm->getServiceLocator();
$controller = new \Validechoixoptions\Controller\Index($sm);
return $controller;
},
),
);
}
怎么了?我不明白如何使用这个工厂。
修改
感谢您的快速回答
我试过了:
'Validechoixoptions'=> function(ControllerManager $cm) {
$sm = $cm->getServiceLocator();
$sm = $sm->get('webapp');
$controller = new \Validechoixoptions\Controller\IndexController($sm);
return $controller;
}
我在Module.php的这个方法中有webapp
:
public function getServiceConfig()
{
return array(
'factories' => array(
'webapp' => new AdapterServiceFactory('webapp'),
但是,我有一个错误:
:缺少Validechoixoptions \ Controller \ IndexController :: __ construct()的参数1,在第170行的/usr/local/zend/share/ZendFramework2/library/Zend/ServiceManager/AbstractPluginManager.php中调用,并在Validechoixoptions / Controller /中定义第32行的IndexController.php
我需要serviceLocator,因为我必须在我的控制器的__construct中创建我的模型实例,并使用serviceLocator,就像__construct模型的参数
由于
编辑2
非常感谢,它有效,我没有发表评论
'Validechoixoptions\Controller\Index' => 'Validechoixoptions\Controller\IndexController'
config / module.config.php 中的
:)
答案 0 :(得分:1)
您无法在构造函数中调用$this->getServiceLocator()
,因为此时尚未填充服务定位器。不要像在示例中那样尝试强制服务定位器,而是使用工厂从服务定位器获取所需的依赖项,并通过它们将它们传递给控制器。构造函数:
public function getControllerConfig() {
return array(
'factories' => array(
'validechoixoptions'=> function(ControllerManager $cm) {
$sm = $cm->getServiceLocator();
$foo = $sm->get('Foo');
$bar = $sm->get('Bar');
$controller = new \Validechoixoptions\Controller\IndexController($foo, $bar);
return $controller;
},
),
);
}
然后你的控制器:
class IndexController extends AbstractActionController
{
protected $foo;
protected $bar;
public function __construct($foo, $bar)
{
$this->foo = $foo;
$this->bar = $bar;
}
}