【问题标题】:Symfony form is valid even on invalid dataSymfony 表单即使在无效数据上也是有效的
【发布时间】:2016-09-08 21:07:27
【问题描述】:

我有一个奇怪的问题。

即使提供的数据不是,我的表单对 symfony 也是有效的。此表单由 ajax 请求创建和发布(这可能会影响它)

    if(!$request->isXmlHttpRequest()){
        return new JsonResponse(['code' => 403], 403);
    }

    $name = $request->query->get('name');

    $contact = new Contact();
    $contact->setName($name);

    $form = $this->get('form.factory')->create(ContactType::class, $contact);

    if($request->isMethod('POST')){
        $form->submit($request);
        if($form->isValid()){
            $em = $this->get('doctrine.orm.entity_manager');

            $em->persist($contact);
            $em->flush();

            return new JsonResponse(['code' => 200, 'id' => $contact->getId(), 'name' => $contact->getName()]);
        }

        return new JsonResponse(['formView' => $this->renderView('@MyBundle/Contacts/contactForm.html.twig',['form' =>$form->createView()]), 'code' => 400, 'errors' => $form->getErrors(true)]);
    }

    return new JsonResponse(['formView' => $this->renderView('@MyBundle/Contacts/contactForm.html.twig',['form' =>$form->createView()]), 'code' => 200], 200);

数据看起来像这样(用 xdebug 检索):

   'id' => NULL,
   'name' => NULL,
   'companyId' => NULL,
   'companyTaxId' => NULL,
   'birthNumber' => NULL,
   'phoneLandLine' => NULL,
   'phoneMobile' => NULL,
   'phoneFax' => NULL,
   'email' => NULL,
   'www' => NULL,

问题是,根据需要设置的名称为空,即使表单被标记为有效并且没有错误。在此之后,有一个关于缺少必填字段的原则例外。

你知道为什么会发生这种情况吗?

Symfony v2.8.10,Doctrine v1.6.4

【问题讨论】:

  • 实体中的名称是否设置为不可为空?
  • 请使用handleRequest 代替submitisSumitted 而不是isMethod 在此处查看最佳实践示例symfony.com/doc/current/best_practices/… 并稍后检查Contact 类中的约束。
  • 是的,它设置为非空(或非引用变量的默认教义行为)。但我一直认为我对表单字段的定义就是说明是否需要。我已经尝试过 handleRequest 和 isSubmitted,但这只是如何从提交的表单中获取数据的不同方法。验证本身并不适用于这两种方式。

标签: php forms validation symfony


【解决方案1】:

可能没有为“名称”字段启用验证。 要启用它 - 将 NotBlank 注释添加到您的实体:

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 *     
 * @Assert\NotBlank()
 */
private $name;

http://symfony.com/doc/current/reference/constraints/NotBlank.html

或者直接给表单添加约束:

$builder
        ->add('name', TextType::class, [
            'constraints' => [
                new \Symfony\Component\Validator\Constraints\NotBlank(),
            ],
        ])

【讨论】:

  • 谢谢!我无法在我的 REST API 上以常用方式 ("required" => true) 设置必填字段($form->isValid() 没有捕获丢失的字段)。而不是这个,new NotBlank() 工作得很好,我现在能够捕捉到缺失的字段:)
【解决方案2】:

required 属性不作为验证器。 引用自http://symfony.com/doc/2.8/reference/forms/types/text.html#required

如果为 true,将呈现 HTML5 必需的属性。相应的标签也将使用所需的类进行渲染。

这是肤浅的,独立于验证。充其量,如果你让 Symfony 猜测你的字段类型,那么这个选项的值就会从你的验证信息中猜测出来。

看看http://symfony.com/doc/2.8/forms.html#form-validation

【讨论】:

  • 我已向实体添加了 Assert 约束,但没有帮助。我会尝试这个可能的解决方案,然后也许开始深入研究 symfony,为什么验证不起作用。
猜你喜欢
  • 1970-01-01
  • 2019-11-27
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多