2012-08-07 15 views
15

Por el momento estoy aprendiendo a usar Symfony2. Llegué al punto en que me explicaron cómo usar Doctrine.Cuándo utilizar Entity Manager en Symfony2

En los ejemplos que se dan a veces usan el gestor de entidades:

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

y en otros ejemplos no se utiliza el gestor de entidades:

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

Así que en realidad trató el primer ejemplo sin obtener el Administrador de entidad:

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

y obtuvo los mismos resultados.

Entonces, ¿cuándo realmente necesito el administrador de entidades y cuándo está bien simplemente ir al repositorio de una vez?

Respuesta

28

En cuanto a ControllergetDoctrine() es igual a $this->get('doctrine'), una instancia de Symfony\Bundle\DoctrineBundle\Registry. Registro proporciona:

Por lo tanto, es igual a $this->getDoctrine()->getRepository()$this->getDoctrine()->getEntityManager()->getRepository().

Gestor de entidades es útil cuando se desea mantener o eliminar una entidad:

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

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

Si se acaba de traer los datos, se puede obtener sólo el repositorio:

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

O mejor , si está utilizando repositorios personalizados, ajuste getRepository() en una función de controlador ya que puede obtener la función de autocompletar desde su IDE:

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

Ya sabía que necesitaba usar el administrador de entidades al usar 'flush()'. También la idea de utilizar una función 'getProductRepository()' es algo que podría ser útil, ¡gracias! –

+1

@MatsRietdijk feliz de ser de ayuda! Siempre envuelvo '$ this-> get ('some service')' en funciones personalizadas en mi 'BaseController' para obtener la autocompleción ... – gremo

+1

¿Cuál es la ubicación de' AcmeStoreBundle: Product 'donde puedo encontrar' Product' en mi aplicación Symfony. –

2

Creo que el getDoctrine()->getRepository() es simplemente un atajo al getDoctrine()->getEntityManager()->getRepository(). No revisé el código fuente, pero me parece bastante razonable.

+0

Gracias, parece ser un atajo. –

0

Si planea hacer varias operaciones con el administrador de entidades (como obtener un repositorio, conservar una entidad, enjuagar, etc.), primero obtenga el administrador de entidades y guárdelo en una variable. De lo contrario, puede obtener el repositorio del administrador de entidades y llamar al método que desee en la clase de repositorio, todo en una sola línea. Ambas formas funcionarán. Es solo una cuestión de estilo de codificación y sus necesidades.