繁体   English   中英

Symfony / Doctrine:实体“模式”注释不依赖于环境吗?

[英]Symfony/Doctrine: Entity “schema” annotation not environment dependent?

我在使功能测试在Symfony3中使用Doctrine运行时遇到麻烦。 我将代码组织成两个捆绑,一个实体管理器需要访问它们,而实体存储在两个不同的MySQL数据库中。 为此,所有实体在其定义中均具有“模式”注释,如下所示:

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

没有此设置,根据我的经验,Doctrine schema:create工具无法在正确的数据库中正确创建实体。 但是,似乎该架构注释不被视为与环境有关。

因此,当我要运行需要加载固定装置的功能测试时,ORMPurger会尝试清除schema.tablename,在此应使用表/模式“ test_schema”。

有什么方法可以保留模式注释,但使其依赖于环境,以便在环境“测试”时使用不同的模式?

编辑:

当您使用不同的Symfony环境时,对实体使用“ schema”注释似乎非常糟糕。 至少与MySQl结合使用时,至少我认为这是原因,因为MySQL实际上并不支持架构。 无论--env设置如何,我所有的Symfony或Doctrine命令都试图从字面上接受模式注释。

我做了一些进一步的挖掘,发现我需要做的事情完美地布置在这里:

在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;
    } 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM