在构造ZF2中使用Service

时间:2014-04-03 10:33:22

标签: php zend-framework2

我的控制器构造中必须有 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

中的

:)

1 个答案:

答案 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;
    }
}