【问题标题】:zf2 ServiceManagerAwareInterface in Fieldset字段集中的 zf2 ServiceManagerAwareInterface
【发布时间】:2013-09-29 16:01:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: php forms zend-framework2


    【解决方案1】:

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

    除此之外,潜在的错误来源是您注入的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;
    }
    

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

    【讨论】:

    • 谢谢。 MyFormway\Form\Fieldset\AddressFieldset() 的构造函数永远不会被调用。也永远不要使用'form_elements'-'factories'-'MyFormway\Form\Fieldset\Address'中的module.config.php函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多