我在Symfony2应用程序中实现了自定义EntityRepository
。
我有一个AbstractEntity(用作某些实体的父级):
/**
* Abstract Entity.
*
* @ORM\Entity(repositoryClass="App\Util\Entity\AbstractRepository")
*/
abstract class AbstractEntity
{
/**
* Get id.
*
* @return int
*/
public function getId()
{
return $this->id;
}
// ...
}
自定义EntityRepository
:
/**
* Abstract Repository.
*/
class AbstractRepository extends Doctrine\ORM\EntityRepository
{
/**
* Handles resource not found from find.
*
* @param int $id
*
* @return object
*/
public function findOrFail($id)
{
if (null == $entity = $this->find($id)) {
return $this->fail();
}
return $entity;
}
//...
}
其中一个从AbstractEntity
延伸的实体:
/**
* @ORM\Table(name="tags_sport")
*/
class Tag extends AbstractEntity
{
// ...
}
使用@ORM\Entity
注释在我的AbstractEntity中声明自定义存储库一次
我想让我的实体使用相同的存储库而不重新声明它。
但是会发生错误:
Class "App\SportBundle\Entity\Tag" sub class of "App\Util\Entity\AbstractEntity" is not a valid entity or mapped super class
这是由子实体中缺少@ORM\Entity
注释引起的。
但没有任何改变
如果我在子实体中添加@ORM\Entity
注释,它将使用默认的EntityRepository
。
如何覆盖从EntityRepository
扩展的每个实体的默认AbstractEntity
?
编辑我接受了@Rvanlaak的回答,感谢答案评论中给出的要点。
最终解决方案包括this gist
答案 0 :(得分:1)
这是两个独立的东西,有一个抽象的父实体,并有一个抽象的父存储库。
默认情况下,每个实体都会使用EntityRepository
。该实体可以有一个存储库,可以通过ORM\Entity
注释定义:http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes
假设您自己创建TagRepository
,从AbstractRepository
扩展就没有问题。
第二,拥有一个抽象的实体。这就像告诉Doctrine你的实体有一个父类。这是不可能的。解决方案是使用traits
。在这里找到了一篇很好的文章:http://www.sitepoint.com/using-traits-doctrine-entities/