Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

ObjectManager como argumento de un servicio

18 de febrero de 2014

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

#1

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

18 febrero 2014, 15:46
#2

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

19 febrero 2014, 1:27
#3

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

19 febrero 2014, 11:12