Doctrine 2 + ZF2: создание сущностей через ServiceManager

В приложении Zend Framework 2 у меня есть несколько сущностей Doctrine2, которые имеют зависимости, которые внедряются в них с помощью ServiceManager, т. Е. Для ордера требуется новый Счет при его создании.

'service_manager' => [
    'invokables' => [
        'Sales\Entity\Invoice' => 'Sales\Entity\Invoice'
    ],
    'factories' => [
        'Sales\Entity\Order' => function($sm) {
            $order = new \Sales\Entity\Order();
            $order->setInvoice($sm->get('Sales\Entity\Invoice'));
            return $order;
        }
    ],
    'shared' => [
        'Sales\Entity\Invoice' => false,
        'Sales\Entity\Order' => false
    ]
]

С этой конфигурацией, нет проблем создать новый Заказ, которому назначен новый Счет в любом месте приложения, потому что, например, внутри контроллера я могу просто вызвать

$order = $this->getServiceLocator()->get('serviceManager')->get('Sales\Entity\Order');

Однако при извлечении Order через EntityRepository зависимости не будут внедряться, потому что, насколько мне известно, Doctrine создает экземпляр объекта, вызывая его конструктор, а затем клонируя этот экземпляр всякий раз, когда ему нужен другой. Доктрина, таким образом, обходит ServiceManager и, следовательно, внедрение зависимости.

И. е.

$order = $entityManager->getRepository('Sales\Entity\Order')->find(42);

даст мне заказ без нового счета.

Я знаю, что непосредственное внедрение зависимостей в сущности может быть не лучшим решением, но в данный момент мы работаем с толстыми моделями в нашем приложении без уровня обслуживания моделей, и для быстрого исправления я должен заставить это работать. Рефакторинг запланирован на будущее, но сейчас не подлежит обсуждению.

Можно ли изменить способ, которым Учение создает новую сущность? Я заглянул в EntityManager и EntityRepository, но пока не нашел решения.

0 ответов

Другие вопросы по тегам