如何在Symfony 5.0中从FormEventSubscriber登录?
我是Symfony的新手,我正在尝试构建我的应用程序。但我在文档中找不到如何在事件订阅服务器中为表单使用记录器 我有monolog.yml:如何在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
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不是服务。。。