【问题标题】:Symfony $form->isValid returns always trueSymfony $form->isValid 总是返回 true
【发布时间】:2016-10-07 07:05:10
【问题描述】:

我在表单验证方面有一点问题。 isValid() 方法总是返回 true。

这是我的代码:

public function ajaxAction(Request $request)
{
    if ($request->isXMLHttpRequest()) {

        $contact = new Contact;
        $form = $this->createForm(ContactType::class, $contact);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            return new Response('Ok', 200);
        }
}

ContactType 代码:

class ContactType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('mail')
            ->add('message')
            ->add('save', SubmitType::class)
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'MyApp\MyBundle\Entity\Contact'
        ));
    }
}

以及联系人实体:

use Symfony\Component\Validator\Constraints as Assert;

class Contact
{
    /*
     * @var string
     *
     * @Asserts\NotBlank("Vous devez écrire votre nom")
     * @Assert\Length(
     *      min = 3,
     *      max = 70
     * )
     */
    protected $name;

    /*
     * @var string
     *
     * @Assert\NotBlank(message = "Ce champs ne doit pas être vide")
     * @Assert\Email(
     *      checkMX = true,
     *      message = "Cet adresse email n'est pas valide"
     * )
     */
    protected $mail;

    /*
     * @var string
     *
     * @Assert\NotBlank( message = "Vous devez écrire un message")
     * @Assert\Length(
     *      min = 10,
     *      max = 1000,
     *      minMessage = "Votre message doit comporter au moins {{ limit }} caractères",
     *      maxMessage = "Votre message ne doit pas dépasser {{ limit }} caractères"
     * )
     */
    protected $message;

即使我不遵循验证约束,ajaxAction 的代码也总是返回 200 Ok 响应。

你有解决这个问题的想法吗?

【问题讨论】:

  • 你为什么会期待任何其他 http 代码?
  • @ybert 在你的控制器中添加一个 else 语句,看看会发生什么if ($form->isSubmitted() && $form->isValid()) { return new Response('Ok', 200); } else { return $this->handleView($this-view(['form' => $form], Codes::HTTP_BAD_REQUEST));}
  • @lolmx 是一样的。方法 isValid() 总是返回 true。

标签: forms validation entity symfony


【解决方案1】:

您的实体类中的注释有一些错误。

  1. @Asserts\NotBlank("Vous devez écrire votre nom") 需要一个消息值 如果您使用 Constraints as Assert,则不是 Asserts
  2. 主要是注解以/**开头而不是/*开头

使用这个:

/**
 * @var string
 *
 * @Assert\NotBlank(message = "Vous devez écrire votre nom")
 * @Assert\Length(
 *      min = 3,
 *      max = 70
 * )
 */
protected $name;

/**
 * @var string
 *
 * @Assert\NotBlank(message = "Ce champs ne doit pas être vide")
 * @Assert\Email(
 *      checkMX = true,
 *      message = "Cet adresse email n'est pas valide"
 * )
 */
protected $mail;

/**
 * @var string
 *
 * @Assert\NotBlank(message = "Vous devez écrire un message")
 * @Assert\Length(
 *      min = 10,
 *      max = 1000,
 *      minMessage = "Votre message doit comporter au moins {{ limit }} caractères",
 *      maxMessage = "Votre message ne doit pas dépasser {{ limit }} caractères"
 * )
 */
protected $message;

【讨论】:

  • 哦,谢谢!!!原来是/** ...我不知道我之前怎么没看到!
【解决方案2】:

试试这个来检索任何通过常规表单验证的错误:

if ($form->isValid() && $form->isSubmitted()) {
    /** @var FormErrorIterator $errors */
    $errors = $form->getErrors(true);

    /** @var FormError $error */
    while ($error = $errors->current()) {
        $this->addFlash('error', $error->getMessage());
        $errors->next();
    }
}

【讨论】:

  • 再次检查您的数据,可能所有验证条件都已满足
  • 我已经检查过了。例如,我在消息字段中输入了 2 个字符。它需要最少 10 个字符,但它通过 isValid 方法
【解决方案3】:

您是否在配置中明确启用注释?

# app/config/config.yml

framework:
    validation: { enable_annotations: true }

考虑到您正在使用注释方法来指定约束,您需要显式启用注释:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多