À l'aide de l'EntityManager à l'intérieur de la Doctrine 2.0 entités
J'ai 2 entités: Pays (id, nom) et de la Cartographie (id, objet, internalId, externalId).
Pays et de Cartographie ne sont pas connectés avec des associations (à cause de la Cartographie en ligne, non seulement pour le pays). J'ai besoin d'obtenir id externe pour les pays utilisant les conditions suivantes:
country.id = mapping.internalId
mapping.object = 'country'
Donc j'ai l'intention d'ajouter une fonction getExternalId() dans un Pays
function getExternalId() {
$em = Registry::getEntityManager();
$mapping = $em->getRepository('Mapping')->findOneBy(array(
'object' => 'country',
'internalId' => $this->getId()
));
return !empty($mapping) ? $mapping->getExternalId() : false;
}
Questions:
- Il est de bonne pratique d'utiliser l'EntityManager à l'intérieur des entités? Si non, veuillez expliquer comment faire pour obtenir l'id externe dans mon cas?
- Peut-être qu'il est possible d'associer des Pays et de la Cartographie à l'aide de fichiers yaml?
Merci d'avance!
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas une bonne idée de permettre à une entité de l'objet à compter du gestionnaire d'entités. Il relie l'entité de la couche de persistance, ce qui est un problème de Doctrine 2 a été spécialement essayez de résoudre. Le plus grand tracas en s'appuyant sur le gestionnaire d'entités est que cela rend votre modèle difficiles à tester, dans l'isolement, loin de la base de données.
Vous devriez probablement être en s'appuyant sur des objets de service pour gérer les opérations qui s'appuient sur l'entité gestionnaire.
En outre, vous pouvez créer des méthodes proxy sur votre modèle de faire appel à un service à l'objet qui est défini à l'externe. Un objet de service serait beaucoup plus facile de se moquer de tout les tests que l'entité gestionnaire.
Cela pourrait ne pas être la meilleure idée, mais il y a une façon simple de le faire.
La
UnitOfWork
classe dans la doctrine hydrate toute entité qui met en œuvreObjectManagerAware
avec le gestionnaire de l'entité et les métadonnées de la classe de l'entité.Tout ce que vous avez à faire pour obtenir l'entité mangeoire dans votre entité est de mettre en œuvre l'interface comme indiqué dans l'exemple ci-dessous:
Si vous créez une nouvelle entité, plutôt que de l'interrogation de la base de données, vous devez définir le gestionnaire d'entité manuellement, par exemple avec une méthode de définition.
Je pense que ce dont vous avez besoin à l'aide d'une Entité Dépôts. Celles-ci sont détaillées dans la documentation, quoique un peu difficile à trouver des informations sur. Voici un lien vers le Prise En Main article qui montre comment on pourrait créer un "référentiel" de l'accès des fonctions pour votre entités.
En outre, voici quelques pseudo-code pour vous aider à démarrer:
Une légère pointe additif au présent (PHP 5.4 être à l'alpha 2 au moment de ce post) qui peuvent être utilisés à l'avenir:
Ici sont quelques exemples de l'utilisation de php 5.4 caractéristiques Doctrine2; dont l'une est appelée entité active et fournit active record fonctionnalité de style à l'intérieur de Doctrine 2, y compris l'accès à l'entité gestionnaire de l'intérieur de l'entité.