我有一个独立的 Symfony 包(与 Composer 一起安装),其中包含实体和存储库,可以在连接同一数据库的应用程序之间共享。
使用配置(显示的 yml)将实体附加到每个应用程序:
doctrine:
orm:
mappings:
acme:
type: annotation
dir: %kernel.root_dir%/../vendor/acme/entities/src/Entities
prefix: Acme\Entities
alias: Acme
嗯,这是在应用程序中包含外部实体的最简单方法,但看起来有点难看。
每当我从实体管理器获取存储库时:
$entityManager->getRepository('Acme:User');
我得到预配置的存储库(在实体配置中)或默认的 Doctrine\ORM\EntityRepository
。
现在我想覆盖单个实体的捆绑(或默认)存储库类。有没有机会通过一些配置/扩展/等来做到这一点?
我认为,最好看的方式是这样的:
doctrine:
orm:
....:
Acme\Entities\User:
repositoryClass: My\Super\Repository
或使用标签:
my.super.repository:
class: My\Super\Repository
tags:
- { name: doctrine.custom.repository, entity: Acme\Entities\User }
最佳答案
您可以使用 LoadClassMetadata 事件:
class LoadClassMetadataSubscriber implements EventSubscriber
{
/**
* @inheritdoc
*/
public function getSubscribedEvents()
{
return [
Events::loadClassMetadata
];
}
/**
* @param LoadClassMetadataEventArgs $eventArgs
*/
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
/**
* @var \Doctrine\ORM\Mapping\ClassMetadata $classMetadata
*/
$classMetadata = $eventArgs->getClassMetadata();
if ($classMetadata->getName() !== 'Acme\Entities\User') {
return;
}
$classMetadata->customRepositoryClassName = 'My\Super\Repository';
}
}
Entities are attached to every applications using configuration (yml shown): Well, it was the easiest way to include external entities in application, but looks a bit ugly.
您可以启用 auto_mapping
关于php - 如何覆盖 Symfony 中捆绑的 Doctrine 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35942910/