php - 如何覆盖 Symfony 中捆绑的 Doctrine 存储库

标签 php doctrine-orm doctrine symfony

我有一个独立的 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';
    }

}

Doctrine Events

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/

相关文章:

PHP 正则表达式 @ vs/

php - 如何安装 doctrine 2.2 ORM

php - 使用 id 作为引用的数组连接

php - 路由分页链接的问题

php - symfony2/教义 2/Mysql : null values saved as empty strings

Doctrine Where 'IN' 运算符

mysql - SQL 查询过滤建议

symfony - Doctrine:在 ORDERBY 中使用用户定义的函数

php - 为什么我的正则表达式组量词不起作用?

php - Symfony Doctrine 事件订阅者未在调试 :event-dispatcher 中列出