Symfony 5, почему я не могу использовать FormsEvents::POST_SUBMIT в прослушивателе событий формы?

Я пытаюсь добавить EventListener в свою форму Symfony, но у меня проблема с первым параметром $listener $builder->addEventListener. Я хочу использовать FormEvents::POST_SUBMIT для создания нового поля после отправки. В основном я хочу отобразить список городов на основе почтового индекса. Ошибка говорит мне, что объект имеет неправильный тип, но я не вижу, какой объект я мог бы использовать вместо этого, потому что документация говорит мне об этом. Я работаю над Symfony 5.2

Вот мой код формы и ошибка:

<?php

namespace App\Form;

use App\Entity\Advert;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Event\PostSubmitEvent;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;

class CreateAdvertType extends AbstractType
{
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {


        $repositoryCities=$this->entityManager->getRepository('App\Entity\Cities');
        $cities = $repositoryCities->findByPostal("86330");

        $repositoryMake=$this->entityManager->getRepository('App\Entity\Make');
        $makes = $repositoryMake->findAll();

        $builder
            ->add('car_make',EntityType::class, array(
                'class' => 'App\Entity\Make',
                'choices'  => $makes,
            ))
            ->add('car_model')
            ->add('car_motorisation')
            ->add('car_fuel',ChoiceType::class, array(
                'choices'  => [
                    'Diesel' => 'diesel',
                    'Essence' => 'essence',
                    'Electrique' => 'electrique',
                    'Hybride' => 'hybride',
                ],
            ))

            ->add('price', IntegerType::class, array(
                'attr' => array(
                    'min' => 0,
                    'max' => 20,
                )
            ))
            ->add('code_postal')
            ->add('description')

            ->add('save', SubmitType::class, ['label' => 'Create Task'])

            ->addEventListener(FormEvents::POST_SUBMIT,function (FormEvents $event){
                $repository=$this->getDoctrine()->getManager()->getRepository('App\Entity\Cities');
                $form = $event->getForm();
                $cities = $repository->findByPostal($form->getData()['code_postal']);
                $form->add('city' ,EntityType::class, array(
                    'class' => 'App\Entity\Cities',
                    'choices' => $cities
                ));
            })



        ;


    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Advert::class,
        ]);
    }
}

Argument 1 passed to App\Form\CreateAdvertType::App\Form\{closure}() must be an instance of Symfony\Component\Form\FormEvents, instance of Symfony\Component\Form\Event\PreSetDataEvent given, called in /var/www/html/trymycar/vendor/symfony/event-dispatcher/EventDispatcher.php on line 230
Изображения не приветствуются. Скопируйте/вставьте соответствующие части сообщения об ошибке в свой вопрос.
Cerad 22.12.2020 17:21

Также неясно, чего вы пытаетесь достичь с помощью своего события POST_SUBMIT. В документах указано: «На данный момент вы не можете добавлять или удалять поля в текущей форме и ее дочерних элементах». Если вы хотите отобразить список городов на основе почтового индекса, то PRE_SET_DATA, вероятно, то, что вам нужно.

Cerad 22.12.2020 17:31

@Cerad Спасибо за советы! Кажется, проблема одинакова со всеми разными событиями (PRE_SET_DATA, POST_SUBMIT...), но да, это именно то, что я хочу сделать.

Valentin GUICHETEAU 22.12.2020 19:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
3
965
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Должно быть FormEvent (единственное, а не множественное число).

//           plural HERE ---v                singular HERE ---v
->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
    // ...
})

Другие вопросы по теме