zf2 Fieldset中的ServiceManagerAwareInterface

时间:2013-09-29 16:01:59

标签: php forms zend-framework2

在我的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 !!!

1 个答案:

答案 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')