Symfony - 与存储库的数据库连接



我正在重构我的一个控制器中的代码以将其放入服务中。

在控制器中,实体管理器以名为legacy的数据库连接为目标。

问题是,我没有在我的服务中注入实体管理器,而只是注入了 OrderRepository。

如何在没有实体管理器的情况下,将良好的数据库连接与服务中的存储库作为目标?

订单控制器

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

根据一些评论,基本问题似乎是有多个实体经理。 如今,有大量的自动化功能适用于一个实体经理,但不适用于多个经理。

您基本上需要手动定义服务。

# 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:  WhateverRepositoryOrderRepository
factory: ['doctrine.orm.legacy_entity_manager', 'getRepository']
arguments:  
- 'WhateverEntityOrder'
# define default repository
order_repository.default:
class:  WhateverRepositoryOrderRepository
factory: ['doctrine.orm.default_entity_manager', 'getRepository']
arguments:  
- 'WhateverEntityOrder'
# then your service
WhateverServiceMyService:
'@order_repository.legacy'

你应该很高兴。 请注意,您的存储库需要扩展 EntityRepository,而不是原则包的 ServiceEntityRepository。

如果你觉得这工作量太大,那么只需注入原则包的实体管理器注册表,然后做 ControllerTrait::getDoctrine($name( 做的事情。

您必须忘记,您始终可以在存储库中获取实体管理器,就像这样:

$em = $this->getEntityManager();

然后你可以正常使用它调用持久,刷新等。

请注意,存储库类本身与数据库访问层的功能(如插入或更新(无关,因此它应该调用实体管理器来执行它们。

相关内容

  • 没有找到相关文章

最新更新