2017-03-01 2 views
0

J'ai des difficultés à faire fonctionner des tests fonctionnels dans Symfony3 avec Doctrine. J'ai le code organisé en deux paquets avec lesquels un EntityManager doit avoir accès avec des entités stockées dans deux bases de données MySQL différentes. Pour ce faire, toutes les entités ont une annotation « schéma » dans leur définition, comme ceci:Symfony/Doctrine: Entité "schéma" annotation non dépendante de l'environnement?

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

Sans ce paramètre, il a été mon expérience, que le schéma Doctrine: outil de création ne peut pas créer correctement les entités dans les bonnes bases de données. Cependant, il semble que l'annotation du schéma ne soit pas considérée comme dépendante de l'environnement.

Ainsi, lorsque je veux exécuter des tests fonctionnels qui ont besoin de charger des appareils, l'ORMPurger essaie de purger schema.tablename, où il devrait utiliser la table/schéma "test_schema".

Est-il possible de conserver l'annotation du schéma mais de la rendre dépendante de l'environnement, de sorte que lorsque l'environnement est "test", un schéma différent est utilisé?

EDIT:

Il semble que l'utilisation de l'annotation « schéma » pour les entités est assez terrible tout autour lorsque vous utilisez différents environnements Symfony. Au moins lorsqu'il est utilisé en conjonction avec MySQl, au moins je pense que c'est la raison, puisque MySQL ne supporte pas réellement les schémas. Chaque commande Symfony ou Doctrine J'ai essayé de prendre l'annotation du schéma littéralement, quel que soit le paramètre --env.

Répondre

0

Je l'ai fait un peu plus creuser et trouvé ce que je devais faire parfaitement aménagé ici:

Programmatically modify table's schema name in Doctrine2?

J'ajouté un EventListener, qui ajoute le schéma correct selon l'EM utilisé, donc je ne nécessite plus d'annotations de schéma codées en dur.

Heres le code pour l'auditeur que j'ai fait:

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