在我的Zend \ Form \ Fieldset AddressFieldset中,它需要一个Zend \ Db \ TableGateway \ AbstractTableGateway BundeslandTable用于\ Zend \ Form \ Element \ Select()。
所以我在这个AddressFieldset中实现了\ Zend \ ServiceManager \ ServiceManagerAwareInterface,并使用init()而不是__construct()。
在module.config.php中(不仅在'form_elements'测试中,也在'service_manager'中)
'form_elements' => array(
'factories' => array(
'MyFormway\Form\Fieldset\Address' => function($sm) {
$addressFieldset = new MyFormway\Form\Fieldset\AddressFieldset();
$addressFieldset->setServiceManager($sm);
return $addressFieldset;
}
),
),
在\ Zend \ Form \ Form的init()中:
$this->add(array(
'type' => 'MyFormway\Form\Fieldset\Address',
'name' => 'address',
));
这会引发错误:
Zend\Form\FormElementManager::get was unable to fetch or create an instance for MyFormway\Form\Fieldset\Address
为什么zend无法获取此Fieldset的实例?
编辑-----------------------
'form_elements' => array(
'factories' => array(
'MyFormway\Form\Fieldset\Address' => function($formElementManager) {
die('inna form_elements config');
$addressFieldset = new \MyFormway\Form\Fieldset\AddressFieldset();
$addressFieldset->setServiceManager($formElementManager->getServiceLocator());
return $addressFieldset;
}
),
),
因为我有Zend \ Form \ FormElementManager我获取ServiceLocator ...可能不需要,因为所有XxxManager都扩展了Zend \ ServiceManager \ AbstractPluginManager,这扩展了ServiceManager。 在FormElementManager和AbstractPluginManager中都没有方法getServiceManager()。
但是我的问题:没有调用die()加上上面的错误。这是一个错误吗? ......我代表一堵大墙:(
编辑-----------------------
适用于表格,但不适用于Fieldset !!!
答案 0 :(得分:0)
您是否可以快速检查\Invokable
是否被调用?一些专业die()
- 调试就足够了。
除此之外,潜在的错误来源是您注入ServiceManager
。在您提供的代码中,您实际上并未注入ServiceLocator
,而是FormElementManager
。
$addressFieldset->setServiceManager($sm->getServiceManager());
这样做被认为是糟糕的实践。你应该只注入你真正需要的东西。鉴于您注入了整个经理,我假设您正在使用Doctrine,或者您需要访问某些DB数据。这样做:
'Foo' => function ($formElementManager) {
$sl = $formElementManager->getServiceManager();
$fs = new FooFieldset();
$fs->setDbDependency(
$sl->get('MyDbDependency')
);
return $fs;
}
最后一点注意事项:当您添加字段集时,您不需要在'name' => 'foo'
中添加$this->add()
,因为字段集的名称将通过Fieldset __construct('name')
。