在我的Zend''Form''Fieldset AddressFieldset中,它需要一个Zend''Db''TableGateway''AbstractTableGateway BundeslandTable for a ''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 无法获取此字段集的实例?
编辑-----------------------
'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(( 加上上面的错误。这是一个错误吗?...我代表一堵大墙:(
编辑-----------------------
它适用于表单,但不适用于字段集!!
你能快速检查一下是否调用了'Invokable
吗?一些专业的die()
调试就足够了。
除此之外,潜在的错误源是您注入ServiceManager
。在您提供的代码中,您实际上并不是在注入ServiceLocator
而是在注入FormElementManager
。
$addressFieldset->setServiceManager($sm->getServiceManager());
这样做被认为是不良做法。你应该只注入你实际需要的东西。鉴于您正在注入整个经理,我假设您要么正在使用 Doctrine,要么需要访问一些数据库数据。这样做:
'Foo' => function ($formElementManager) {
$sl = $formElementManager->getServiceManager();
$fs = new FooFieldset();
$fs->setDbDependency(
$sl->get('MyDbDependency')
);
return $fs;
}
最后一点说明:当您添加字段集时,您无需在$this->add()
中添加'name' => 'foo'
,因为字段集的名称将通过字段集__construct('name')
定义。