【发布时间】:2021-10-12 13:45:52
【问题描述】:
在我使用 Symfony 的第一个项目期间,我需要一种从实体中获取随机项目的方法,因此我在我的存储库中创建了它。
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();而不是硬编码或将其指定为参数。