如何在Symfony 5.0中从FormEventSubscriber登录?

如何在Symfony 5.0中从FormEventSubscriber登录?,symfony,logging,symfony5,Symfony,Logging,Symfony5,我是Symfony的新手,我正在尝试构建我的应用程序。但我在文档中找不到如何在事件订阅服务器中为表单使用记录器 我有monolog.yml: monolog: channels: ["my"] handlers: my_handler: type: stream path: "%kernel.project_dir%/log/%kernel.environment%.event.log" le

我是Symfony的新手,我正在尝试构建我的应用程序。但我在文档中找不到如何在事件订阅服务器中为表单使用记录器

我有monolog.yml:

monolog:
    channels: ["my"]
    handlers:
        my_handler:
            type: stream
            path: "%kernel.project_dir%/log/%kernel.environment%.event.log"
            level: debug
            channels: ["my"]
我有一个表格类型:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', EmailType::class)
//here some other fields are added
            ->addEventSubscriber(new FormEventSubscriber());
    }
然后,我有了一个很好的虚拟FormEventSubscriber:

class FormEventSubscriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return [
            FormEvents::PRE_SET_DATA => 'onPreSetData',
            FormEvents::PRE_SUBMIT   => 'onPreSubmit',
        ];
    }

    public function onPreSetData(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();
    }

    public function onPreSubmit(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();
    }
}
    private $logger;

    public function __construct(LoggerInterface $myLogger)
    {
        $this->logger = $myLogger;
    }
    private $logger;

    public function __construct(LoggerInterface $myLogger)
    {
        $this->logger = $myLogger;
    }
现在我必须向它添加LoggerInterface。我正在尝试将此代码插入订阅服务器:

class FormEventSubscriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return [
            FormEvents::PRE_SET_DATA => 'onPreSetData',
            FormEvents::PRE_SUBMIT   => 'onPreSubmit',
        ];
    }

    public function onPreSetData(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();
    }

    public function onPreSubmit(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();
    }
}
    private $logger;

    public function __construct(LoggerInterface $myLogger)
    {
        $this->logger = $myLogger;
    }
    private $logger;

    public function __construct(LoggerInterface $myLogger)
    {
        $this->logger = $myLogger;
    }
然后Symfony说我必须添加参数来调用FormType中的addEventSubscriber(new FormEventSubscriber())

那我该怎么做呢?当我简单地在FormType中创建Logger()类的对象并将其添加为参数时,它不会记录任何内容

Upd。我找到了方法,很明显:)我也只是在FormType中添加了构造函数,就像在subscriber中一样:

class FormEventSubscriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return [
            FormEvents::PRE_SET_DATA => 'onPreSetData',
            FormEvents::PRE_SUBMIT   => 'onPreSubmit',
        ];
    }

    public function onPreSetData(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();
    }

    public function onPreSubmit(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();
    }
}
    private $logger;

    public function __construct(LoggerInterface $myLogger)
    {
        $this->logger = $myLogger;
    }
    private $logger;

    public function __construct(LoggerInterface $myLogger)
    {
        $this->logger = $myLogger;
    }
然后打电话

->addEventSubscriber(new FormEventSubscriber($this->logger))

在FormType中,而不是调用
new FormEventSubscriber()
您应该注入服务,就像在订阅服务器中使用记录器一样。因此,表单的构造函数应该类似于:

private$formEventSubscriber;
公共函数构造(FormEventSubscriber$FormEventSubscriber)
{
$this->formEventSubscriber=$formEventSubscriber;
}

当您使用表单生成器在控制器中创建表单时,它将知道如何从容器中获取表单,而不是手动创建表单。这通常是通过Symfony表单内部的
DependencyInjectionExtension
自动完成的,通常不需要您进行任何额外的配置或更改。

将记录器注入到您的表单类型中,然后将其传递给订阅服务器。我不确定将订阅服务器注入该类型是否是最佳方法。文档始终显示订阅服务器在该类型中是新的。如果您的表单有多个具有相同表单类型的字段,那么最终将共享订阅服务器实例。这可能是坏的,也可能不是坏的。不确定。或者至少使订阅者非共享。这是一个合理的警告,但我认为这不太可能导致问题,我想不出有状态订阅者需要在字段/用法之间“重置”的用例。问题是FormEventSubscriber不是服务。。。