2017-03-01 55 views
0

我在使用Doctrine在Symfony3中运行功能测试时遇到了麻烦。 我有两个捆绑组织的代码,需要由一个EntityManager访问存储在两个不同MySQL数据库中的实体。 要做到这一点,所有的实体有一个“模式”标注在他们的定义是这样的:Symfony/Doctrine:Entity“schema”注释与环境无关?

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

如果没有这个设置,它一直是我的经验,教条模式:创建工具无法正确地创建在正确的数据库中的实体。 但是看起来,模式注释不被认为是依赖于环境的。

因此,当我想运行需要加载灯具的功能测试时,ORMPurger会尝试清除schema.tablename,它应该使用表/模式“test_schema”。

是否有任何方法来保留模式注释但使其依赖于环境,以便在环境“测试”时使用不同的模式?

编辑:

看来,用“模式”的注释是实体非常可怕各地,当您使用不同的Symfony环境。至少在与MySQl结合使用时,至少我认为这是原因,因为MySQL实际上并不支持模式。 每一个Symfony或Doctrine命令我试图从字面上理解模式注释,而不管--env设置如何。

回答

0

我做了一些更多的挖掘,发现我所需要的做的完全都在这了:

Programmatically modify table's schema name in Doctrine2?

所以我添加了一个事件监听,根据正确的模式到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; 
    } 
}