Как войти из FormEventSubscriber в Symfony 5.0? - PullRequest
1 голос
/ 14 января 2020

Я новичок в Symfony, и я пытаюсь создать свое приложение. Но я не могу найти в документации, как использовать Logger в подписчике событий для формы.

У меня есть monolog.yml:

monolog:
    channels: ["my"]
    handlers:
        my_handler:
            type: stream
            path: "%kernel.project_dir%/log/%kernel.environment%.event.log"
            level: debug
            channels: ["my"]

У меня есть FormType:

    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 говорит, что я должен добавить аргумент для вызова addEventSubscriber (new FormEventSubscriber ()) в FormType.

Итак как я должен это сделать? Когда я просто создаю объект класса Logger () в FormType и добавляю его в качестве аргумента, он ничего не записывает

Upd. Я нашел способ, и это было очевидно :) Я просто добавил конструктор в FormType, как в подписчике:

    private $logger;

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

, а затем вызвал

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

1 Ответ

1 голос
/ 14 января 2020

В вашем FormType вместо вызова new FormEventSubscriber() вы должны внедрить сервис, так же, как вы делаете это с регистратором в подписчике. Таким образом, конструктор вашей формы должен выглядеть примерно так:

private $formEventSubscriber;

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

Когда вы создаете форму в своем контроллере с помощью построителя форм, она будет знать, что нужно извлечь форму из контейнера, а не создавать ее вручную. Обычно это делается автоматически через DependencyInjectionExtension внутри Symfony формы и обычно не требует каких-либо дополнительных настроек или изменений с вашей стороны.

...