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

Referencia circular detectada para el servicio "doctrine.orm.default_entity_manager"

15 de abril de 2015

Hola, estoy usando los EventListener de Doctrine, siguiente esta configuracion: How to Register Event Listeners and Subscribers

Después de crear la clase listener y declarar el servicio correctamente todo funciona bien. El problema es cuando intento inyectar el siguiente servicio en el listener:

services:
    producto_repository:
        class: Doctrine\ORM\EntityRepository
        factory: ["@doctrine.orm.entity_manager", getRepository]
        arguments: [AppBundle\Entity\Producto]

    producto.entity_listener:
        class: AppBundle\EventListener\ProductoListener
        arguments: ["@session", "@producto_repository"]
        tags:
            - { name: doctrine.event_subscriber }

Obtengo este error:

Circular reference detected for service "doctrine.orm.default_entity_manager", path: 
"doctrine.orm.default_entity_manager -> doctrine.dbal.default_connection -> 
producto.entity_listener -> producto_repository".

Intenté poner el lazy: true pero si lo hago de esta manera después en un controlador, cuando hago:

$this->get('producto_repository');

Me arroja un error. ¿Qué debo hacer para evitar esta referencia circular?

Gracias.


Respuestas

#1

En este caso, el error que se te produce es correcto. Tal y como puedes ver en el mensaje de error, al pasar como argumento un servicio que depende del entity manager de Doctrine, estás creando una dependencia circular: una cosa depende de otra que a su vez depende de la primera.

Para solucionarlo, no pases el repositorio de los productos como argumento y en el código de tu subscriber de Doctrine, obtén el entity manager de Doctrine directamente así:

public function prePersist(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();
    $em = $args->getEntityManager();
 
    // ...
}

@javiereguiluz

15 abril 2015, 9:39