【问题标题】:Use Service in construct ZF2在构造 ZF2 中使用服务
【发布时间】:2014-05-15 02:56:16
【问题描述】:

我的控制器结构中必须有 ServiceLocator,但我不能。

在我的方法中,我可以用来获取数据库参数:

$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

:)

【问题讨论】:

    标签: php zend-framework2


    【解决方案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;
        }
    }
    

    【讨论】:

    • 我编辑了我的第一篇文章。将 serviceLocator 之类的参数获取到模型的 __construct 方法是正确的还是我不应该这样做?因为这可能会成为一种不好的做法,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2016-12-15
    • 1970-01-01
    相关资源
    最近更新 更多