验证的 Symfony 4.4 FormType 问题

Symfony 4.4 FormType problem with validate

提交时我的验证表单有问题,没有错误消息,只是刷新页面,我不明白我忘记了什么?我尝试使用 SubmitType 但我遇到了同样的问题。

我的表单类型

class FilmType extends AbstractType
{
   public function buildForm(FormBuilderInterface $builder, array $options)
   {

    $builder
        ->add('titre')
        ->add('resume')
        ->add('dateSortie')
        ->add('personnages', EntityType::class, [
            'class' => Personnage::class,
            'query_builder' => function (PersonnageRepository $pr) {
                return $pr->createQueryBuilder('p')
                    ->orderBy('p.nom', 'ASC');
            },
            'choice_label' => 'nom'
        ])
        ->getForm();
}

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

}

我的控制器,我觉得还可以

 /**
 *
 * @param Request $request
 * @Route("/film/new", name="film_new")
 * @return Response
 *
 */
public function new(Request $request): Response
{
    $film = new Film();
    $form = $this->createForm(FilmType::class, $film);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($film);
        $entityManager->flush();

        return $this->redirectToRoute('home');
    }

    return $this->render('film/new.html.twig', [
        'film' => $film,
        'form' => $form->createView(),
    ]);
}

我的 Twig,我添加了 form_errors 但仅此而已

{% block body %}
    <form>
        <div class="form-group">
            {{ form_start(form)}}
            {{ form_errors(form) }}
            {{ form_widget(form) }}
            <button> Envoyer </button>
            {{ form_end(form) }}
        </div>
    </form>
{% endblock %}

我的电影实体.....

/**
 * @ORM\Entity(repositoryClass="App\Repository\FilmRepository")
 */
class Film
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $titre;

    /**
     * @ORM\Column(type="text")
     */
    private $resume;

    /**
     * @ORM\Column(type="date")
     */
    private $dateSortie;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Personnage", mappedBy="film")
     */
    private $personnages;

    public function __construct()
    {
        $this->personnages = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitre(): ?string
    {
        return $this->titre;
    }

    public function setTitre(string $titre): self
    {
        $this->titre = $titre;

        return $this;
    }

    public function getResume(): ?string
    {
        return $this->resume;
    }

    public function setResume(string $resume): self
    {
        $this->resume = $resume;

        return $this;
    }

    public function getDateSortie(): ?\DateTimeInterface
    {
        return $this->dateSortie;
    }

    public function setDateSortie(\DateTimeInterface $dateSortie): self
    {
        $this->dateSortie = $dateSortie;

        return $this;
    }

    /**
     * @return Collection|Personnage[]
     */
    public function getPersonnages(): Collection
    {
        return $this->personnages;
    }

    public function addPersonnage(Personnage $personnage): self
    {
        if (!$this->personnages->contains($personnage)) {
            $this->personnages[] = $personnage;
            $personnage->addFilm($this);
        }

        return $this;
    }

    public function removePersonnage(Personnage $personnage): self
    {
        if ($this->personnages->contains($personnage)) {
            $this->personnages->removeElement($personnage);
            $personnage->removeFilm($this);
        }

        return $this;
    }

更改您的控制器:

 /**
 *
 * @param Request $request
 * @Route("/film/new", name="film_new")
 * @return Response
 *
 */
public function new(Request $request): Response
{
    $film = new Film();
    $form = $this->createForm(FilmType::class, $film);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($film);
        $entityManager->flush();

        $this->addFlash('success', 'SUCCESS!');
        return $this->redirectToRoute('home');
    }

    return $this->render('film/new.html.twig', [
        'film' => $film,
        'form' => $form->createView(),
    ]);
}

并更改您的树枝模板:

{% block body %}
    {% for message in app.flashes('success') %}
        <div>
            {{ message }}
        </div>
    {% endfor %}
    <hr>
    <form>
        <div class="form-group">
            {{ form_start(form)}}
            {{ form_errors(form) }}
            {{ form_widget(form) }}
            <button> Envoyer </button>
            {{ form_end(form) }}
        </div>
    </form>
{% endblock %}

将您的 FilmType.php 修改为:

添加 'multiple' => true 以获得人物数组[] :)

<?php

namespace App\Form;

use App\Entity\Film;
use App\Entity\Personnage;
use App\Repository\PersonnageRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class FilmType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('titre')
            ->add('resume')
            ->add('dateSortie')
            ->add('personnages', EntityType::class, [
                'class' => Personnage::class,
                'query_builder' => function (PersonnageRepository $pr) {
                    return $pr->createQueryBuilder('p')
                        ->orderBy('p.nom', 'ASC');
                },
                'choice_label' => 'nom',
                'multiple' => true
            ])

                    ->getForm();

    }

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

如果对您有用,请不要忘记接受:)