2

在我的 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() 加上上面的错误。它是一个错误吗?...我代表一堵大墙:(

编辑 - - - - - - - - - - - -

它适用于表单,但不适用于字段集!!!

4

1 回答 1

0

你能快速检查一下是否\Invokable调用了?一些专业die()的调试就足够了。

除此之外,潜在的错误来源是您注入的ServiceManager. 在您提供的代码中,您实际上并没有ServiceLocator注入FormElementManager.

$addressFieldset->setServiceManager($sm->getServiceManager());

这样做被认为是不好的做法。你应该只注入你真正需要的东西。鉴于您正在注入整个管理器,我假设您正在使用 Doctrine,或者您需要访问一些 DB-Data。像这样做:

'Foo' => function ($formElementManager) {
    $sl = $formElementManager->getServiceManager();
    $fs = new FooFieldset();
    $fs->setDbDependency(
        $sl->get('MyDbDependency')
    );
    return $fs;
}

最后一点注意:当你添加一个 Fieldset 时,你不需要在 中添加'name' => 'foo'$this->add()因为 fieldset 的名称将通过 Fieldset 定义__construct('name')

于 2013-09-30T06:05:43.957 回答