Symfony/Doctrine: 实体 "schema" 注释不依赖于环境?

Symfony/Doctrine: Entity "schema" annotation not environment dependent?

我在使用 Doctrine 在 Symfony3 中对 运行 进行功能测试时遇到了问题。 我将代码组织成两个包,一个 EntityManager 需要访问它们,实体存储在两个不同的 MySQL 数据库中。 为此,所有实体在其定义中都有一个 "schema" 注释,如下所示:

/**
 * @ORM/Table(name="tablename", schema="schema")
 * @Entity( ... )
 */

没有这个设置,根据我的经验,Doctrine schema:create 工具无法在正确的数据库中正确地创建实体。 然而,模式注释似乎不被视为依赖于环境。

所以当我想要 运行 需要加载固定装置的功能测试时,ORMPurger 会尝试清除 schema.tablename,它应该使用 table/schema "test_schema"。

有什么方法可以保留模式注释但使其依赖于环境,以便当环境为 "test" 时,使用不同的模式?

编辑:

当您使用不同的 Symfony 环境时,对实体使用 "schema" 注释似乎非常糟糕。至少当与 MySQl 一起使用时,至少我认为这是原因,因为 MySQL 实际上不支持模式。 无论 --env 设置如何,我都尝试从字面上获取模式注释的每个 Symfony 或 Doctrine 命令。

我进行了更多挖掘,发现我需要做的事情完美地列在这里:

Programmatically modify table's schema name in Doctrine2?

所以我添加了一个 EventListener,它根据使用的 EM 添加了正确的模式,所以我不再需要硬编码模式注释。

这是我制作的侦听器的代码:

<?php

namespace /* ... */

use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;

class MappingListener
{
    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
    {
        /** @var EntityManagerInterface $entityManager */
        $entityManager = $eventArgs->getEntityManager();
        /** @var ClassMetadata $classMetadata */
        $classMetadata = $eventArgs->getClassMetadata();

        $database = $entityManager->getConnection()->getDatabase();

        $classMetadata->table['schema'] = $database;
    } 
}