我只是将我的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实例请帮帮我。
答案 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());
}