1

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

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

这是我的字段集代码:

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

请帮我。

4

3 回答 3

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.

于 2013-03-30T09:07:27.827 回答
0

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

$form = new SomeForm($serviceManager)

SomeForm 内部:

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

    $this->add($fieldSet);
}

您可以将其嵌套到您希望的深度。关于这一切如何完成的一个很好的文档是

于 2013-03-29T19:01:57.810 回答
0

尝试调用FormElementManagersgetServiceLocator()方法

public function init() {
    var_dump($this->serviceLocator->getServiceLocator());
}
于 2013-03-29T19:02:24.080 回答