Я реорганизую код в одном из своих контроллеров, чтобы поместить его в службу.

В контроллере диспетчер сущностей нацелен на соединение с базой данных под названием устаревшее .

Проблема в том, что я не внедрил Entity Manager в свою службу, а просто внедрил OrderRepository.

Как я могу нацелить хорошее соединение db с репозиторием в моей службе без Entity Manager?

< Сильный > OrderController

// In my Controller
$em = $this->getDoctrine()->getManager('legacy');
$em->persist($order);
$em->flush();

< Сильный > OrderService

// In my Service
public function __construct(OrderRepository $orderRepository)
{
  $this->orderRepository = $orderRepository;
}

public function updateOrderStatus(Order $order)
{
   // some code ...

   $this->orderRepository->save($order);
}
1
Kevin 24 Сен 2018 в 15:41

2 ответа

Лучший ответ

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

В основном вам нужно определить свои службы вручную.

# services.yaml

# assume we have 
# doctrine.orm.default_entity_manager and
# doctrine.orm.legacy_entity_manager 
# already defined through configuration

# define legacy repository
order_repository.legacy:
    class:  Whatever\Repository\OrderRepository
    factory: ['doctrine.orm.legacy_entity_manager', 'getRepository']
    arguments:  
        - 'Whatever\Entity\Order'

# define default repository
order_repository.default:
    class:  Whatever\Repository\OrderRepository
    factory: ['doctrine.orm.default_entity_manager', 'getRepository']
    arguments:  
        - 'Whatever\Entity\Order'

# then your service
Whatever\Service\MyService:
    '@order_repository.legacy'

И тебе должно быть хорошо. Обратите внимание, что ваш репозиторий должен расширять EntityRepository, а не ServiceEntityRepository из пакета доктрины.

И если вам кажется, что это слишком много работы, просто вставьте реестр диспетчера сущностей пакета доктрины и сделайте то, что делает ControllerTrait :: getDoctrine ($ name).

2
Cerad 24 Сен 2018 в 14:27

Вы должны забыть, что вы всегда можете получить диспетчер сущностей в своем репозитории вот так:

$em = $this->getEntityManager();

Тогда вы можете использовать его, как обычно, вызывая persist, flush и т. д.

Обратите внимание, что сам класс Repository не зависит от функций уровня доступа к базе данных, таких как вставка или обновление, поэтому он должен вызывать диспетчер сущностей для их выполнения.

0
iiirxs 24 Сен 2018 в 12:55