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?
Regarder Controller
getDoctrine()
est égal à $this->get('doctrine')
, une instance de Symfony\Bundle\DoctrineBundle\Registry
. Le registre fournit:
getEntityManager()
retournant Doctrine\ORM\EntityManager
, qui à son tour fournit getRepository()
getRepository()
retournant Doctrine\ORM\EntityRepository
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');
}
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.
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.