2017-03-01 15 views
0

DoctrineとSymfony3で機能テストを実行するのに問題があります。 2つの異なるMySQLデータベースに格納されたエンティティを持つ1つのEntityManagerによってアクセスされる必要のある2つのバンドルでコードを編成しました。 はこれを達成するために、すべてのエンティティは次のように、彼らの定義では、「スキーマ」注釈を持っている:作成ツールを正しく作成することはできません。Symfony/Doctrine:エンティティ "スキーマ"アノテーションは環境に依存しませんか?

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

この設定を行わないと、それはDoctrineのスキーマことを、私の経験をされています適切なデータベース内のエンティティ。 しかし、スキーマのアノテーションは環境に依存しないと考えられます。

したがって、フィクスチャをロードする必要のある機能テストを実行する場合、ORMPurgerはschema/table/schema "test_schema"を使用するschema.tablenameを削除しようとします。

スキーマ注釈を保持する方法はありますか?環境に依存するようにする方法はありますか?環境が「テスト」のときに別のスキーマが使用されるようにしますか?

EDIT:

あなたが別のsymfonyの環境を使用しているとき、エンティティの「スキーマ」注釈を使用すると、すべての周りはかなりひどいであることが表示されます。少なくともMySQlと組み合わせて使用​​すると、少なくともそれが理由だと思います.MySQLは実際にスキーマをサポートしていないからです。 すべてのSymfonyまたはDoctrineコマンド--env設定に関係なく、スキーマの注釈を文字通り取ろうとしました。

答えて

0

私はいくつかのより多くの掘り行われ、私は完全にここにレイアウトされないために必要なものを見つけた:

Programmatically modify table's schema name in Doctrine2?

だから私はEMに従って正しいスキーマを追加するのEventListenerを追加ので、私を使用ハードコーディングされたスキーマ注釈はもう必要ありません。

相続人は私が作ったリスナーのためのコード:

<?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; 
    } 
} 
関連する問題