zf2 ServiceManagerAwareInterface in Fieldset


zf2 ServiceManagerAwareInterface in Fieldset

在我的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')定义。