抽象存储库和@Entity注释继承

时间:2016-01-13 12:00:41

标签: symfony doctrine-orm doctrine

我在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

中的整个自定义存储库

1 个答案:

答案 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/