我在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
我知道經典的方法(一個實體的一個Repository,它可以從我想要的任何地方擴展)。我的問題是如何避免這一點。我不想從AbstractRepository中擴展很多空的存儲庫。現在,我使用repositoryClass屬性爲所有實體使用同一個存儲庫。我只是想刪除這個在所有實體中重複的語句。我的目標是:爲每個從特定類擴展的實體使用主存儲庫。我的AbstractEntity更多的是一個基類,它避免了重複的代碼,比如標識符(這對所有實體都是一樣的)。 – chalasr
現在我明白了。這可以通過修飾通過'DoctrineBundle'擴展名註冊的'RepositoryFactory'來實現。 https://github.com/doctrine/DoctrineBundle/blob/master/DependencyInjection/DoctrineExtension.php#L455-L457在https://gist.github上也找到了相關的Gist。com/docteurklein/9778800 – Rvanlaak
感謝您的關注,我會在接受您的意見之前嘗試一下並在等待更多答案。 – chalasr