【问题标题】:Right way to extend the EntityRepository in Symfony 5 [closed]在 Symfony 5 中扩展 EntityRepository 的正确方法 [关闭]
【发布时间】:2021-10-12 13:45:52
【问题描述】:

在我使用 Symfony 的第一个项目期间,我需要一种从实体中获取随机项目的方法,因此我在我的存储库中创建了它。

findRand 方法只是从组表中检索一个随机项。

findRand 这个方法对我的项目非常有用,所以我希望在每个存储库中都有类似的东西,而不是在每个存储库中手动创建它。

因此,我想知道扩展 EntityRepository 的正确方法,其中定义了每个存储库的基本方法,例如 find、findAll、findBy 等。

我应该创建这样的东西吗?

class BasicRepository extends EntityRepository

编辑:

我试过这个:

但我收到此错误。

  The class 'App\Repository\GroupRepository' was not found in the chain configured namespaces App\Entity  

用户@will-b给出的解决方案,回答了问题:

"由于 /Repository 目录默认设置为 Symfony 中的服务原型,因此您的 BasicRepository 应声明为抽象类 AbstractBasicRepository 扩展 ServiceEntityRepository 以防止 Symfony 将其注册为服务并防止学说应用映射。您应该还重构您的 AbstractBasicRepository::findRand() 以利用 $table = $this->getClassMetadata()->getTableName(); 而不是硬编码或将其指定为参数。”

【问题讨论】:

  • 到目前为止你尝试过什么?你被困在哪里了?如果从通用存储库扩展听起来对您有好处,为什么不这样做呢?
  • 你说的“正道”是什么意思?通过扩展 EntityRepository 是否对您不起作用?或者,您可以使用Trait 将方法添加到要实现::findRand() 的存储库中。另一种方法是创建一个查询服务,它允许您注入服务并在存储库之外调用该方法,因为不鼓励使用$em->getRepository(),而是使用依赖注入,因为getRepository 是一个服务定位器。
  • 大家好,我已经尝试扩展 EntityRepository 但它不起作用,所以我尝试使用 ServiceEntityRepository 并且它有效但不能作为任何存储库可用的方法。我将尝试使用@WillB 的特质方法。建议
  • 您还应该将代码发布为文本而不是图像。
  • 由于 /Repository 目录默认设置为 Symfony 中的服务原型,因此您的 BasicRepository 应声明为 abstract class AbstractBasicRepository extends ServiceEntityRepository 以防止 Symfony 将其注册为服务并阻止学说适用映射。您还应该重构 AbstractBasicRepository::findRand() 以利用 $table = $this->getClassMetadata()->getTableName(); 而不是硬编码或将其指定为参数。

标签: php symfony oop


【解决方案1】:

一段时间以来,suggested way to create a custom repository 一直作为服务,从 DoctrineBundle 扩展一个类 - ServiceEntityRepository。

<?php
// see page on symfony.com for the list of 'use' statements
class ProductRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Product::class);
    }
}

它的优点是它是一个服务,并且可以自动装配,所以当这个类被创建后,它可以立即在其他地方使用,只要输入完全限定的名称,如果服务是默认设置的Symfony 应用程序(或明确列出,如果没有)。

这也是 MakerBundle 为实体创建默认存储库的方式。

如果在实体类的注释/配置中提到了此类,它也将是通过 EntityManager 的 getRepository() 返回的存储库 - 正如您已经使用的那样。

【讨论】:

  • 感谢您的回答。我的问题可能不够清楚。我现在添加了更多细节。我想在存储库之间使用通用方法,例如 findBy 或 findAll。我想要一个可用于任何存储库的 findRand 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
相关资源
最近更新 更多