У меня есть этот код:
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 ??
{
}
Но я не знаю, какой интерфейс или архитектура ему нужна, я не знаю, как это сделать.
Инициализаторы просто должны быть вызываемыми, вы можете сделать класс вызываемым, объявив __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',
),
),
Других решений пока нет …