symfony 4 中的表单验证不起作用

维萨夫

我创建了一个实体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:Entitymake:crud命令生成,我只@Assert\NotBlank()$name属性添加了

唐卡利斯托

任何验证之前应用表单和发布的数据绑定如果您键入提示设置器/加法器,您将在这种情况下运行。

从我的 POV 来看,您不应该修改您的“模型”代码以满足第三方代码(此处为表单组件),因为您可能会遇到诸如错误使用方法之类的可能问题(如果需要存在值,则唯一可能的确保“非空”要求的方法是避免接受空值;只要您“忘记”调用valid对象,验证器本身将不执行任何操作,即使在这种情况下,您仍然拥有一个有效可刷新的对象)。

相反,您应该将 DTO 或 ValueObject 绑定到您的表单。这些对象可以接受您想要的任何类型的值(基本上是您期望的值和 null)。然后您可以执行验证,例如,使用“命令”(不是 symfony 的,是 DDD“概念”中的“命令”),您可以填充和执行其他“数据通道”或对真实实体的操作

即使 ste 的答案会使其起作用,在概念上也是错误的,因为将您的代码暴露于本答案中上面解释的“域风险”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章