Symfony 4,一个服务于多个实体的存储库类

时间:2018-04-11 15:19:47

标签: symfony doctrine-orm symfony4

symfony新手。我正在关注this文档。我从另一个应用程序导入的表中映射了多个实体,这些实体没有自动创建存储库,并且有许多实体可以手动完成。但是,我想创建一个连接多个实体的单一存储库类。

根据文档我目前的存储库是

Product repository
class ProductRepository extends ServiceEntityRepository
{
public function __construct(RegistryInterface $registry)
{
    parent::__construct($registry, Product::class);
}

我将在我的控制器中使用它,如

$respository = $this->getDoctrine()->getRepository(Product::class);

但是我也有其他实体类,

Customer, User

仅举几例。

如何或仅可以使用Product Respository与其他实体(如

)进行交互
 $respositoryUser = $this->getDoctrine()->getRepository('User');

或是否可以从现有实体自动生成存储库。

2 个答案:

答案 0 :(得分:0)

您可以像生产产品一样为任何实体创建存储库。 这将工作并为用户提供标准的实体存储库:

$userRepository = $this->getDoctrine()->getRepository(User::class);

如果您想要找到需要更多计算的特定内容,您可以创建一个专用存储库。除非您想将其直接注入控制器或服务,否则您仍将以相同的方式获取存储库。如果是这种情况,只需在您的实体中指定存储库。

答案 1 :(得分:0)

看起来您正在寻找在Java / Persistence等其他环境中使用的等效设施...... 我认为你所看到的是一组相关实体的DaoService,而不是共享的存储库。 Custom Repository类按定义绑定到类实体,尝试共享其功能将以映射混淆结束。

通过围绕DaoService类组织代码,您将有机会在一个位置重新组合有关这些实体的所有数据访问。

如何组织您的DaoService代码?

  1. 您通常使用默认实体管理器...在同一数据库空间中更好的组实体。但多重实体也可以谨慎管理。
  2. 将通用存储库用于组中的每个实体

    $ userRepo = $ this-> em-> getRepository(User :: class)

    $ prodRepo = $ this-> em-> getRepository(Product :: class)

  3. 因为你看到了你需要的壮举......

    1. 请记住,这里主要关注的是代码组织的模块化,然后确保集中在这个类和每个实体中:
      • crud操作和特定搜索功能
      • 与这些实体组相关的业务逻辑
      • 某些业务功能的基于模块的服务
      • 您还可以定义此服务类将实现的接口,使您的模型更灵活,并且该接口类易于使用。 如果您的服务定义良好,它将使客户端控制器更加轻巧和清洁,并成为您的MVC解决方案的模型方。