我创建了一个实体Testme
并使用它生成了 crud 文件bin/console make:crud
并尝试向表单添加验证规则,但它不起作用:
我的实体:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\TestmeRepository")
*/
class Testme
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @Assert\NotBlank()
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $description;
....
表格:
<?php
namespace App\Form;
use App\Entity\Testme;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class TestmeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('description')
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Testme::class,
]);
}
}
控制器动作:
/**
* @Route("/{id}/edit", name="testme_edit", methods="GET|POST")
*/
public function edit(Request $request, Testme $testme): Response
{
$form = $this->createForm(TestmeType::class, $testme);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('testme_edit', ['id' => $testme->getId()]);
}
return $this->render('testme/edit.html.twig', [
'testme' => $testme,
'form' => $form->createView(),
]);
}
如果该name
字段为空,则在创建新实体时会正确显示验证错误,但是当我编辑它并清空该name
字段时,我会在线InvalidArgumentException
上得到一个$form->handleRequest($request);
:
给定类型为“string”、“NULL”的预期参数。
我错过了什么?
编辑:所有代码都由make:Entity
和make:crud
命令生成,我只@Assert\NotBlank()
在$name
属性上添加了。
在任何验证之前应用表单和发布的数据绑定。如果您键入提示设置器/加法器,您将在这种情况下运行。
从我的 POV 来看,您不应该修改您的“模型”代码以满足第三方代码(此处为表单组件),因为您可能会遇到诸如错误使用方法之类的可能问题(如果需要存在值,则唯一可能的确保“非空”要求的方法是避免接受空值;只要您“忘记”调用valid
对象,验证器本身将不执行任何操作,即使在这种情况下,您仍然拥有一个有效且可刷新的对象)。
相反,您应该将 DTO 或 ValueObject 绑定到您的表单。这些对象可以接受您想要的任何类型的值(基本上是您期望的值和 null)。然后您可以执行验证,例如,使用“命令”(不是 symfony 的,是 DDD“概念”中的“命令”),您可以填充和执行其他“数据通道”或对真实实体的操作。
即使 ste 的答案会使其起作用,在概念上也是错误的,因为将您的代码暴露于本答案中上面解释的“域风险”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句