[英]How to resolve “Circular reference detected for service” issue?
我正在嘗試將我的存儲庫服務注入到EventListener中,但這會導致我跟蹤異常,這是因為我對Symfony2的基本知識,我不知道如何解決。 例外情況是:
bootstrap.php.cache第2129行中的ServiceCircularReferenceException:
檢測到服務“doctrine.orm.default_entity_manager”的循環引用,路徑:“doctrine.orm.default_entity_manager - > doctrine.dbal.default_connection - > person.connect.listener - > tag.repository.service”。
這是我如何聲明存儲庫和監聽器:
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 }
我能找到的大多數答案建議注入服務容器,但我真的不想這樣做。 有沒有辦法妥善解決這個問題?
UPD:這是監聽器的代碼。 在我嘗試注入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();
}
}
}
至於TagRepository是EntityRepository的后代,請嘗試在postPersist事件中獲取其實例。 像這樣:
// using full classname:
$tagRepo = $entityManager->getRepository("Application\Bundle\PersonBundle\Entity\TagRepository");
// alternatively:
$tagRepo = $entityManager->getRepository("ApplicationPersonBundle:Tag");
Yo也可以更改您的存儲庫聲明,不要使用工廠並使用這兩種方法之一 。
這將避免使用循環引用,並且比使用EntityManager類更清晰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.