'Symfony form validation does not work on edit

I have a form with 3 fields as below : storeClient , type and line that belong to Fashion entity. I basically have the same problem mentioned here : Symfony Form Validation not working in Edit But I was surprised when I edited the form and chose the placeholder as option for Client and I filled the line and type fields , I got that for the client field, it DOES display my validation message "Please choose an option" .which is good . However for the remaining two fields, if line or type are edited in such a way to choose the placeholder option, the application crashed and gives the argumet exception error.

I did a dump; die; inside the controller (you can see it commented below) . And I got the $fashion object like this when I chose the placeholder for all the fields aka for the client,type and line fields :

Fashion object :
storeClient: null
line: Proxies ...\RefLine
___isinitilized___ :true
and all the info of the line that was set initiallly in this object when I first enterede its edit page.
type: Proxies ...\RefType
___isinitilized___ :true
and all the info of the type that was set initiallly in this object when I first enterede its edit page.

so my question is why the validations work on edit for the client field and does not work for line and type ? I do not think that it is related to the fact that it is a choicettype whereas the other two are entitytype. Moreover, I didn't put a "?" in the setter of client. So i don't see why it works for this field and WHY it gave a Null value when I printed the object and it didn't print the initial client value that was already set in the object when I first landed on the edit page although the two other fields hold the values that were already stored in the object initially.

FashionType.php

->add('storeClient', ChoiceType::class,
            [
                'label' => 'Store Client',
                'choices' => $choicesClient,
                'choice_value' => function ($value) {
                    if ($value instanceof Client) {
                        return $value->getId();
                    } else {
                        return $value;
                    }
                },
                'placeholder' => 'Choose ..',
                'choice_label' => 'diplayLabel',
                'attr' => ['class' => "chosen"],
                'required' => true,
            ]
        )
        ->add('type',
            EntityType::class,
            [
                'label' => 'Clothes Type',
                'class' => RefType::class,
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('refType')
                        ->orderBy('refType.id', 'ASC');
                },
                'attr' => ['class' => "chosen"],
                'placeholder' => 'Choose..',
                'required' => true,
                'choice_label' => 'label',
            ])
        ->add('line',
            EntityType::class,
            [
                'label' => 'cotation.creation_form.ligne_de_cotation',
                'class' => RefLine::class,
                'choice_value'  => function ($value) {
                    if ($value instanceof RefLine) {
                        return $value->getId();
                    } else {
                        return $value;
                    }
                },
                'query_builder' => function (EntityRepository $er) {
                    return $er->getShoppingLines();
                },
                'attr' => ['class' => "chosen"],
                'placeholder' => 'Choose..',
                'required' => true,
                'choice_label' => 'getLabel',
            ])

IN my controller, this function is called upon submitting the form :

public function validerAction(Request $request, $idFashion)
{
    $em = $this->getDoctrine()->getManager();
    /** @var Fashion $fashion */
    $fashion = ($idFashion === null) ? new Fashion() : $em->getRepository(
        'App:Fashion'
    )->find($idFashion);

    $form = $this->createForm(FashionType::class, $fashion);
     // try {
    $form->handleRequest($request); 
     //} catch(\InvalidArgumentException) {
//dump($fashion);die;
     //    }
    if ($form->isSubmitted() && $form->isValid()) {..}

Here are my setters:

/**
 * Set line
 *
 * @param  Refline  $line
 *
 * @return Fashion
 */
public function setLine(RefLine $line)
{
  $this->line = $line;

  return $this;
}


/**
 * Set type
 *
 * @param  RefType $type
 *
 * @return Fashion
 */
public function setType(RefType $type)
{
  $this->type = $type;

  return $this;
}

/**
 * Set storeClient
 *
 * @param Client $storeClient
 * @return Fashion
 */
public function setStoreClient($storeClient)
{
    $this->storeClient = $storeClient;

    return $this;
}

THe three fields were declared like this :

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\RefLine")
     * @ORM\JoinColumn(name="line_id", referencedColumnName="id", nullable=false)
     */
    private $line;


Solution 1:[1]

In EntityType::class field type is by default nullable. If you want to add validation on that then you have to write this

/**
 * 
 * @Assert\NotBlank(message="Please enter Line", groups="groupName")
 */
private $line;

For more details you can read https://symfony.com/doc/current/validation.html

if you are using group name then you should declare in Form

$resolver->setDefaults([
        // ...
        'validation_groups' => ['Default', 'groupName'],
    ]);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1