Zend Framework 2将Service Manager注入Fieldset

时间:2013-03-29 18:54:48

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

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

我在Global.php和Module.php文件中有数据库驱动程序和服务的定义,如何解释documentation。这项服务适用于所有项目。

这是我的Fieldset代码:

    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实例

请帮帮我。

3 个答案:

答案 0 :(得分:2)

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

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创建的。

答案 1 :(得分:0)

你几乎要构造 - 注入你所有的东西。我这样做如下:

$form = new SomeForm($serviceManager)

Inside SomeForm:

public function __construct(ServiceManager $serviceManager) {
    $fieldSet = new SomeFieldset($serviceManager)

    $this->add($fieldSet);
}

您可以根据需要将其嵌套。关于如何完成所有工作的良好文档是

答案 2 :(得分:0)

尝试调用FormElementManager s getServiceLocator()方法

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