Hola, estoy aprendiendo a utilizar Symfony2, y para el uso de la inyección de dependencias intento basarme en la guía de buenas prácticas publicada en esta web. Me he quedado atascado en el paso de argumentos al servicio a través del fichero de configuración services.yml
de mi bundle.
En la guía se usa un objeto ObjectManager
para gestionar el persist()
y el flush()
, en vez del EntityManager
que yo estaba usando.
Mi pregunta es, ¿cómo paso el ObjectManager
a mi servicio?
Código de mi services.yml
:
parameters: miniblog.manager.comentario.class: MiniBlog\MiniBlogBundle\Entity\ComentarioManager services: miniblog.manager.comentario: class: %miniblog.manager.comentario.class% arguments: - @doctrine.common.persistence.object_manager - %miniblog.entity.comentario.class%
Respuestas
Hace unos días pregunté lo mismo que tú a través de Twitter. La conclusión a la que llegué con las respuestas que me dieron es que deberías pasar realmente el EntityManager
en vez del ObjectManager
. Algo así:
#services.yml # ... services: miniblog.manager.comentario: class: %miniblog.manager.comentario.class% arguments: - @doctrine.orm.entity_manager - %miniblog.entity.comentario.class%
El motivo por el que tienes que trabajar con el EntityManager
es que, en realidad, el ObjectManager
es una interfaz de PHP:
namespace Doctrine\Common\Persistence; interface ObjectManager { ... }
Y la clase EntityManager
implementa esta interfaz:
namespace Doctrine\ORM; use Doctrine\Common\Persistence\ObjectManager; class EntityManager implements ObjectManager { ... }
@javiereguiluz
Ok, gracias. Con el EntityManager no me ha dado problemas. Pero me queda la duda de si el código usado para la guía de buenas prácticas funciona y cómo lo hace. Ya es cuestión de curiosidad.
@hm_sergio
En realidad, la guía de buenas prácticas y en la documentación de Doctrine sí que vas a ver que utilizan el ObjectManager
. Esto se debe a que los creadores de Doctrine son un poco puristas y siempre intentan hacer todo lo mejor posible.
Al utilizar ObjectManager
lo que están diciendo es que su código es muy genérico y no sólo funciona con el EntityManager
sino con cualquier objeto que implemente la interfaz ObjectManager
. Si utilizas MongoDB por ejemplo, en vez de un EntityManager
estás utilizando un DocumentManager
, que curiosamente también implementa ObjectManager
.
En resumen, en la documentación utilizan ObjectManager
porque es un concepto genérico que se puede utilizar con cualquiera de las implementaciones concretas que utilices, sea EntityManager
, DocumentManager
o algún manager propio que hayas desarrollado tú mismo.
@javiereguiluz