web-dev-qa-db-fra.com

Quand utiliser Entity Manager dans Symfony2

En ce moment, j'apprends à utiliser Symfony2. Je suis arrivé au point où ils expliquent comment utiliser Doctrine.

Dans les exemples donnés, ils utilisent parfois le gestionnaire d'entités:

$em = $this->getDoctrine()->getEntityManager();
$products = $em->getRepository('AcmeStoreBundle:Product')
        ->findAllOrderedByName();

et dans d'autres exemples, le gestionnaire d'entité n'est pas utilisé: 

$product = $this->getDoctrine()
        ->getRepository('AcmeStoreBundle:Product')
        ->find($id);

J'ai donc essayé le premier exemple sans obtenir le gestionnaire d'entité:

$repository = $this->getDoctrine()
        ->getRepository('AcmeStoreBundle:Product');
$products = $repository->findAllOrderedByName();

et obtenu les mêmes résultats.

Alors, quand ai-je réellement besoin du gestionnaire d’entités et quand est-il possible d’utiliser le référentiel immédiatement?

15
Mats Rietdijk

Regarder ControllergetDoctrine() est égal à $this->get('doctrine'), une instance de Symfony\Bundle\DoctrineBundle\Registry . Le registre fournit:

Ainsi, $this->getDoctrine()->getRepository() est égal à $this->getDoctrine()->getEntityManager()->getRepository().

Le gestionnaire d'entités est utile lorsque vous souhaitez conserver ou supprimer une entité:

$em = $this->getDoctrine()->getEntityManager();

$em->persist($myEntity);
$em->flush();

Si vous ne faites que récupérer des données, vous ne pouvez obtenir que le référentiel:

$repository = $this->getDoctrine()->getRepository('AcmeStoreBundle:Product');
$product    = $repository->find(1);

Ou mieux, si vous utilisez des référentiels personnalisés, encapsulez getRepository() dans une fonction de contrôleur car vous pouvez obtenir la fonctionnalité de complétion automatique de votre IDE:

/**
 * @return \Acme\HelloBundle\Repository\ProductRepository
 */
protected function getProductRepository()
{
    return $this->getDoctrine()->getRepository('AcmeHelloBundle:Product');
}
29
gremo

Je pense que la getDoctrine()->getRepository() est simplement un raccourci pour getDoctrine()->getEntityManager()->getRepository(). Je n'ai pas vérifié le code source, mais ça me semble plutôt raisonnable.

2
Alessandro Santini

Si vous envisagez d'effectuer plusieurs opérations avec le gestionnaire d'entités (comme obtenir un référentiel, conserver une entité, vider, etc.), commencez par obtenir le gestionnaire d'entités et stockez-le dans une variable. Sinon, vous pouvez obtenir le référentiel à partir du gestionnaire d'entités et appeler la méthode de votre choix sur la classe de référentiel sur une seule ligne. Les deux manières fonctionneront. C'est juste une question de style de codage et de vos besoins.

0
Haig Bedrosian