Symfony - соединение с базой данных с репозиторием - PullRequest
0 голосов
/ 24 сентября 2018

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

В контроллере менеджер сущностей нацелен на соединение с БД, называемое legacy .

Проблема в том, что я не внедрил Entity Manager в свой сервис, а только в OrderRepository.

Как я могу настроить хорошее соединение БД с репозиторием в моем сервисе без Entity Manager?

OrderController

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

Служба заказов

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

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

   $this->orderRepository->save($order);
}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

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

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

# 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) делает.

0 голосов
/ 24 сентября 2018

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

$em = $this->getEntityManager();

, тогда вы можете использовать его, обычно вызывая постоянство, сброс и т. Д.

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

...