Как собрать и инициализировать без замыкания

У меня есть этот код:

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

Решение

Инициализаторы просто должны быть вызываемыми, вы можете сделать класс вызываемым, объявив __invoke() Волшебный метод, тогда вам просто нужно переместить код из вашей анонимной функции в этот метод и, наконец, добавить FQCN для вашего инициализатора в менеджер сервисов, к которому вы его подключаете.

Так что ваш класс должен выглядеть примерно так …

<?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);
}
}
}

Добавьте FQCN в менеджер элементов формы в module.config.php

'form_elements'   => array(
'initializers' => array(
'ObjectManagerInitializer' => 'Application\Initializers\ObjectManagerInitializer',
),
),
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]