@mailer和@twig参数服务错误ServiceCircularReferenceException

时间:2015-08-19 15:00:44

标签: symfony

我试图把枝条当作我服务的论据,但我总是犯同样的错误:

bootstrap.php.cache第2129行中的ServiceCircularReferenceException

检测到服务的循环引用" doctrine.orm.default_entity_manager",路径:" doctrine.orm.default_entity_manager - > doctrine.dbal.default_connection - > wh.participant_listener - > wh.participant_notification - >树枝 - > security.authorization_checker - > security.authentication.manager - > fos_user.user_provider.username - > fos_user.user_manager" .`

这是我的service.yml文件

wh.participant_notification:
    class: WH\TrainingBundle\Notification\Notification
    arguments: [@mailer, @twig]

wh.participant_listener:
    class: WH\TrainingBundle\EventListener\ParticipantListener
    arguments: [@wh.participant_notification]
    tags:
        - { name: doctrine.event_listener, event: postUpdate }
        - { name: doctrine.event_listener, event: postPersist }

我的PartcicipantListenerFile

namespace WH\TrainingBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use WH\TrainingBundle\Notification\Notification;

class ParticipantListener
{


    protected $notification;

    public function __construct(Notification $notification)
    {
        $this->notification = $notification;

    }


}

这个问题只有在我传递第二次服务的@ wh.participant_notificationin参数时才存在

任何团体都有想法?

非常感谢

2 个答案:

答案 0 :(得分:2)

我找到了一个解决方案,不是很漂亮,但它有效:

首先,我在服务的参数中传递服务容器

services:

wh.participant_notification:
    class: WH\TrainingBundle\Notification\Notification
    arguments: ['@service_container']

wh.participant_listener:
    class: WH\TrainingBundle\EventListener\ParticipantListener
    arguments: ['@wh.participant_notification']
    tags:
        - { name: doctrine.event_listener, event: postPersist }

然后在我的Notification.php类中:

use Symfony\Component\DependencyInjection\ContainerInterface as Container;

private $container;

public function __construct(Container $container) {

    $this->container = $container;

}

public function subscribValidation ($participant) {

    $templating = $this->container->get('templating');
    $mailer = $this->container->get('mailer');

    ... 

我无法创建受保护的var $ twig,因为问题仍然存在。 我再说一遍,它只有twig服务(或模板)。 也许另一个人找到了更好的解决方案......

答案 1 :(得分:0)

圆形信息虽然不清楚,但应该引导你。

Doctrine实体管理器加载其中的侦听器wh.participant_notification。您的服务需要twig,而这需要一系列其他事物,其中包含学说实体经理。这导致上述异常。

此问题的一个解决方案是使用setter injection

因此,您可以将服务定义为:

wh.participant_notification:
  class: WH\TrainingBundle\Notification\Notification
  calls:
    - [setMailer, ["@mailer"]]
    - [setTemplating, ["@templating"]]

并向您的Notification类添加setter方法

class Notification
{
  private $mailer;
  private $templating;

  public function setMailer(\Mailer $mailer)
  {
    $this->mailer = $mailer;
  }

  public function setTemplating(\Symfony\Bundle\TwigBundle\TwigEngine $templating)
  {
    $this->templating= $templating;
  }

  ...your code...