簡體   English   中英

如何解決“檢測到服務的循環引用”問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM