2017-03-01 51 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; 
    } 
}