1

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

我有独白.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();
    }
}

现在我必须向它添加 LoggerInterface。我正在尝试将此代码插入订阅者:

    private $logger;

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

然后 Symfony 说我必须在 FormType 中添加参数来调用 addEventSubscriber(new FormEventSubscriber())。

那么我该怎么做呢?当我只是在 FormType 中创建 Logger() 类的对象并将其添加为参数时,它什么也不记录

更新。我找到了方法,很明显:) 我也刚刚向 FormType 添加了构造函数,就像在订阅者中一样:

    private $logger;

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

然后打电话

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

1 回答 1

1

在您的 FormType 中而不是调用new FormEventSubscriber()您应该注入服务,就像您在订阅者中使用记录器一样。所以你的表单的构造函数应该是这样的:

private $formEventSubscriber;

public function __construct(FormEventSubscriber $formEventSubscriber)
{
    $this->formEventSubscriber = $formEventSubscriber;
}

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

于 2020-01-14T06:51:57.863 回答