2016-01-13 68 views
0

我在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 
{ 
    // ... 
} 

自定義存儲庫在我的AbstractEntity使用中聲明一次g @ORM\Entity註釋。
我想讓我的實體使用同一個存儲庫,而無需重新聲明它。

但出現錯誤:

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

如何覆蓋從AbstractEntity延伸的每個實體的默認EntityRepository

編輯我接受@Rvanlaak答案感謝答覆評論中給出的要點。
最終的解決方案包括整個定製庫在this gist

回答

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/

+0

我知道經典的方法(一個實體的一個Repository,它可以從我想要的任何地方擴展)。我的問題是如何避免這一點。我不想從AbstractRepository中擴展很多空的存儲庫。現在,我使用repositoryClass屬性爲所有實體使用同一個存儲庫。我只是想刪除這個在所有實體中重複的語句。我的目標是:爲每個從特定類擴展的實體使用主存儲庫。我的AbstractEntity更多的是一個基類,它避免了重複的代碼,比如標識符(這對所有實體都是一樣的)。 – chalasr

+1

現在我明白了。這可以通過修飾通過'DoctrineBundle'擴展名註冊的'RepositoryFactory'來實現。 https://github.com/doctrine/DoctrineBundle/blob/master/DependencyInjection/DoctrineExtension.php#L455-L457在https://gist.github上也找到了相關的Gist。com/docteurklein/9778800 – Rvanlaak

+0

感謝您的關注,我會在接受您的意見之前嘗試一下並在等待更多答案。 – chalasr