如何构建和初始化器没有关闭

时间:2015-12-08 13:42:13

标签: php forms zend-framework2 initializer

我有这段代码:

public function getFormElementConfig()
    {
        return array(
            'initializers' => array(
                'ObjectManagerInitializer' => function ($element, FormElementManager $formElements) {
                    if ($element instanceof ObjectManagerAwareInterface) {
                        /** @var ServiceLocatorInterface $serviceLocator */
                        $serviceLocator = $formElements->getServiceLocator();
                        $entityManager = $serviceLocator->get('doctrine.entitymanager.orm_default');

                        $element->setObjectManager($entityManager);
                    }
                },
            ),
        );
    }
  

这个formElement配置为我提供了水槽和对象管理器   Doctrine ObjectSelect在我的表单中实现   ObjectManagerAwareInterface。

如何将其从关闭中移出?我没有任何线索,因为初始化程序是自动的。我需要工厂吗?

到目前为止,我试图像这样创建一个配置密钥

 'form_elements'   => array(// here because getFormElementConfig
    'initializers' => array(
        'ObjectManagerInitializer' => 'Application\Initializers\ObjectManagerInitializer',
    ),
),

然后创建一个对象

<?php
namespace Application\Initializers;

class ObjectManagerInitializer // implements or extends ??
{

}

但我不知道它需要哪种界面或架构,我不知道如何构建它。

1 个答案:

答案 0 :(得分:3)

初始化程序只需要可调用,你可以通过声明app.get魔术方法使类可调用,然后你只需要将匿名函数中的代码移动到该方法中,最后为你的FQCN添加服务器管理器的初始化程序,您将其附加到。

所以你的课应该看起来像这样...

__invoke()

将FQCN添加到module.config.php

中的表单元素管理器
<?php
namespace Application\Initializers;

use DoctrineModule\Persistence\ObjectManagerAwareInterface;
use Zend\Form\FormElementManager;
use Zend\ServiceManager\ServiceLocatorInterface;

class ObjectManagerInitializer
{
    public function __invoke($element, FormElementManager $formElements) {
        if ($element instanceof ObjectManagerAwareInterface) {
            /** @var ServiceLocatorInterface $serviceLocator */
            $serviceLocator = $formElements->getServiceLocator();
            $entityManager = $serviceLocator->get('doctrine.entitymanager.orm_default');

            $element->setObjectManager($entityManager);
        }
    }
}