How to resolve "Circular reference detected for service" issue?
As far as TagRepository is descendant of EntityRepository try obtaining its instance in postPersist event. Like this:
// using full classname:
$tagRepo = $entityManager->getRepository("Application\Bundle\PersonBundle\Entity\TagRepository");
// alternatively:
$tagRepo = $entityManager->getRepository("ApplicationPersonBundle:Tag");
Sergii Nester
Updated on July 01, 2022Comments
-
Sergii Nester almost 2 years
I'm trying to inject my repository service into EventListener but that leads me to following exception, which, with my basic knowledge of Symfony2, I have no idea how to resolve. Exception is:
ServiceCircularReferenceException in bootstrap.php.cache line 2129:
Circular reference detected for service "doctrine.orm.default_entity_manager", path: "doctrine.orm.default_entity_manager -> doctrine.dbal.default_connection -> person.connect.listener -> tag.repository.service".
And here is how I've declared repository and listener:
tag.repository.service: class: Application\Bundle\PersonBundle\Entity\TagRepository factory: ["@doctrine", getRepository] arguments: [ Application\Bundle\PersonBundle\Entity\Tag ] person.connect.listener: class: Application\Bundle\PersonBundle\EventListener\ConnectListener arguments: tokenStorage: "@security.token_storage" tagRepo: "@tag.repository.service" tags: - { name: doctrine.event_listener, event: postPersist, connection: default }
Most answers, that I've able to find, suggest injecting service container, but I really don't want do that. Is there any way to resolve this properly?
UPD: Here is the code of the listener. Everything worked fine until I've tried to inject TagRepository
class ConnectListener { /** * @var TokenStorage */ private $tokenStorage; /** * @var TagRepository */ private $tagRepo; /** * @param TokenStorage $tokenStorage * @param TagRepository $tagRepo */ public function __construct(TokenStorage $tokenStorage, TagRepository $tagRepo) { $this->tokenStorage = $tokenStorage; } /** * @param LifecycleEventArgs $args * @return void */ public function postPersist(LifecycleEventArgs $args) { $entity = $args->getEntity(); $entityManager = $args->getEntityManager(); if ($entity instanceof Person) { $user = $this->tokenStorage->getToken()->getUser(); $visibility = new PersonVisibility($entity, $user); $visibility->setVisibilityType(PersonVisibility::VT_CREATED); $entityManager->persist($visibility); $entityManager->flush(); } } }