验证的 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,
]);
}
}
如果对您有用,请不要忘记接受:)
提交时我的验证表单有问题,没有错误消息,只是刷新页面,我不明白我忘记了什么?我尝试使用 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,
]);
}
}
如果对您有用,请不要忘记接受:)