如何在Symfony中覆盖捆绑的Doctrine存储库 [英] How to override bundled Doctrine repository in Symfony

查看:37
本文介绍了如何在Symfony中覆盖捆绑的Doctrine存储库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个独立的Symfony软件包(与Composer一起安装),其中包含实体和存储库,可在连接同一数据库的应用程序之间共享.

I have an independent Symfony bundle (installed with Composer) with entities and repositories to share between my applications that connect same database.

使用配置(显示为yml)将实体附加到每个应用程序:

Entities are attached to every applications using configuration (yml shown):

doctrine:
    orm:
        mappings:
            acme:
                type: annotation
                dir: %kernel.root_dir%/../vendor/acme/entities/src/Entities
                prefix: Acme\Entities
                alias: Acme

嗯,这是在应用程序中包含外部实体的最简单方法,但是看起来有点难看.

Well, it was the easiest way to include external entities in application, but looks a bit ugly.

只要我从实体管理器获取存储库:

Whenever I get repository from entity manager:

$entityManager->getRepository('Acme:User');

我得到了预先配置的存储库(在实体配置中)或默认的 Doctrine \ ORM \ EntityRepository .

I get either preconfigured repository (in entity configuration) or default Doctrine\ORM\EntityRepository.

现在,我想为单个实体覆盖捆绑的(或默认的)存储库类.是否有机会通过一些配置/扩展名/其他方式来做到这一点?

我认为,最好看的方式是这样的:

I think, the best looking way is something like:

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事件:

You can use LoadClassMetadata event:

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事件

使用配置将实体附加到每个应用程序(显示为​​yml):嗯,这是在应用程序中包含外部实体的最简单方法,但是看起来有点难看.

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.

您可以启用自动映射

这篇关于如何在Symfony中覆盖捆绑的Doctrine存储库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆