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
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