Search code examples
symfonysymfony-forms

Symfony 5 why can't I use FormsEvents::POST_SUBMIT in my form event listener?


I'm trying to add an EventListener to my Symfony form but I have a problem with the first parameter $listener of $builder->addEventListener. I want to use FormEvents::POST_SUBMIT to generate a new field after the submit. Basically I want to display list of cities based on the postal code. The error tells me that the object is of the wrong type but I don't see which object I could use instead because the documentation tells me to do so. I'm working on Symfony 5.2

Here is my form code and the error :

<?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

Solution

  • Should be FormEvent (singular not plural).

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