【问题标题】:Zend Framework 2 Inject Service Manager into FieldsetZend Framework 2 将服务管理器注入 Fieldset
【发布时间】:2013-03-20 12:47:49
【问题描述】:

我只是将我的 ZF2 更新到 V2.1.4,以便我可以使用 Zend\Form 类的 init 方法将 ServiceLocator 注入 FieldSet,正如 Zend documentation 所解释的那样。

我在 Global.php 和 Module.php 文件中有数据库驱动程序和服务的定义,还解释了documentation。该服务在所有项目中都可以正常工作。

这是我的字段集代码:

    class UserFieldset extends Fieldset implements ServiceLocatorAwareInterface{
        protected $serviceLocator;  
            public function setServiceLocator(ServiceLocatorInterface $sl) {
                $this->serviceLocator = $sl;
            }
            public function getServiceLocator() {
                return $this->serviceLocator;
            }   
            public function init() {
                var_dump($this->serviceLocator);
            }

            public function __construct() {
                    .........
            }

}

我的问题如下:

在 UserFieldset::init() 方法内部,$this->serviceLocator 不是 Zend\ServiceManager\ServiceManager 的实例,就像从控制器获取服务时那样。 实例是 Zend\Form\FormElementManager 并使用 var_dump,看它没有我的 Zend 配置的任何服务。

如何使用 DI 在 Fieldset 中创建 Zend\ServiceManager\ServiceManager 实例?

请帮帮我。

【问题讨论】:

    标签: dependency-injection zend-framework2 zend-form service-locator servicemanager


    【解决方案1】:

    您可以像这样获取服务管理器实例:

    public function init() {
        // You will get the application wide service manager
        $sm = $this->getFormFactory()->getFormElementManager()->getServiceLocator();
    
        // Now you can get things like the application configuration
        $config = $sm->get('Config');
    }
    

    注意: 确保您的字段集是通过 FormElementManager 创建的。

    【讨论】:

    • 我使用字段集作为表单集合类型,这对我不起作用;它说:在 null 上调用成员函数 get()。
    【解决方案2】:

    尝试调用FormElementManagers getServiceLocator() 方法

    public function init() {
        var_dump($this->serviceLocator->getServiceLocator());
    }
    

    【讨论】:

    • $this->serviceLocator->getServiceLocator() 为 null,FormElementManager 没有在 zend 配置中声明任何内容。
    • 你是否在你的模块中实现了FormElementProviderInterface
    • 是的,除了我在 Module::getFormElementConfig() 方法中定义了一个服务
    【解决方案3】:

    你几乎必须构造函数注入你所有的东西。我这样做如下:

    $form = new SomeForm($serviceManager)
    

    在 SomeForm 内部:

    public function __construct(ServiceManager $serviceManager) {
        $fieldSet = new SomeFieldset($serviceManager)
    
        $this->add($fieldSet);
    }
    

    基本上,您可以随意嵌套。关于这一切如何完成的一个很好的文档是

    【讨论】:

    • 这个解决方案已经被考虑过了,我想在不使用这个技术的情况下注入(如 Zend 文档版本 2.1 所示)。
    • @josepmra 您是否从 ServiceManager 调用表单本身?接口在那里,因为可能在 ZF 的某个地方有一个初始化器,它将在构造后调用 getter。但是您需要从 ServiceManager 调用表单!然后进行注射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多