同一个实体是否可以有两个存储库?
我尝试了类似的方法,但它不起作用..
class PackageRepository extends EntityRepository
{
public function __construct($em, Mapping\ClassMetadata $class)
{
$cmf = $em->getMetadataFactory();
$class = $cmf->getMetadataFor('Product');
parent::__construct($em, $class);
}
}
有什么想法吗?
首先,你为什么要这样做?
第二,回答你的问题。您可以拥有任意数量的存储库来处理相同的实体,毕竟它们只是简单的类。
但是您只能使用 @Repository 注释(或 YAML、XML 等)将一个类与实体类链接。所有映射数据都存储在 EntityManager 中。 EntityManager 将知道只有一个存储库类与实体类链接,如果您尝试使用
$entity->getReposiotry()
或类似的方法获取它,它将仅返回链接的类。
但是没有什么可以阻止您创建自己的类来执行一些查询并直接、显式地调用它们,而不依赖于 EntityManagers 存储库映射。
我也遇到了同样的问题,当两个 Symfony 包使用相同的实体,但每个包的查询不同时,所以我还决定为每个包创建单独的存储库。对于原则 2,解决方案可以是:
代码中:
$myEntityRepo = new MyEntityRepository($entityManager, $entityManager->getClassMetadata('AppBundle:MyEntity'));
我找到了解决方案。 PHP 中称为
Trait
.
示例:
class UserRepository extends EntityRepository {
public function adminQuery1();
public function adminQuery2();
public function adminQuery3();
public function adminQuery4();
public function adminQuery5();
public function adminQuery6();
public function frontEndQuery1();
public function frontEndQuery2();
public function frontEndQuery3();
public function frontEndQuery4();
public function frontEndQuery5();
public function frontEndQuery6();
}
现在继续处理不同的特定查询部分,您的存储库很快就会变得混乱且太长。 你可以
以下示例:
Trait AdminQuery {
public function adminQuery1();
public function adminQuery2();
public function adminQuery3();
public function adminQuery4();
public function adminQuery5();
public function adminQuery6();
}
Trait FrontEndQuery {
public function adminQuery1();
public function adminQuery2();
public function adminQuery3();
public function adminQuery4();
public function adminQuery5();
public function adminQuery6();
}
实际的存储库类。
class UserRepository extends EntityRepository {
use AdminQuery;
use FrontEndQuery;
}
这样做的美妙之处在于,关键字
this
将指代使用 Trait
的上下文,这意味着您可以访问 EntityRepository
的所有功能
终于找到了
Trait
的用例。
要创建可以在 Symfony 中自动连接的自定义实体存储库,您只需要:
<?php
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
class MyEntityRepository extends EntityRepository
{
public function __construct(EntityManagerInterface $em)
{
$class = $em->getClassMetadata(MyEntity::class);
parent::__construct($em, $class);
}
}