关于 Symfony2 中的群序列验证器的问题

2022-08-30 19:20:01

我是Symfony2世界的新手。我试图在Symfony2中学习验证的基础知识时,我遇到了一个问题。根据该指南,要正确管理验证组序列,您必须在类上添加此注释的行:Entity

/**
 * @Assert\GroupSequence({"User", "Strict"})
 */

并在任何您想要处理正确规则的地方放置一些注释。在我的情况下以及其中一个指南中,只有当它首先编译(并尊重我的规则,如最小长度),然后如果与值不同时,该字段才应该有效。问题是它不适合我!passwordusername

我的意思是,我有相同的类,我使用了他们的例子的相同形式:User

$form = $this->createFormBuilder($user, array('validation_groups' => array('signup','strict')))
        ->add('name', 'text')
        ->add('email', 'text')
        ->add('password', 'password')
        ->add('signup', 'submit')
        ->getForm();

这是我的课程:User

<?php

namespace XXX\SiteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * User
 *
 * @ORM\Table(name="users")
 * @ORM\Entity
 * @Assert\GroupSequence({"User", "signup", "strict"}) 
 */
class User
{
    //..

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     * @Assert\NotBlank(groups={"signup"})
     * @Assert\Length(min=3,groups={"signup"})
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="password", type="string", length=255)
     * @Assert\NotBlank(groups={"signup"})
     * @Assert\Length(min=7,groups={"signup"})     
     */
    private $password;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255)
     * @Assert\NotBlank(groups={"signup"})     
     * @Assert\Email(checkMX=true, groups={"signup"})     
     */
    private $email;

    /**
     * @Assert\True(groups={"strict"})
     */
    public function isPasswordLegal()
    {
        return $this->name != $this->password;
    }

    //..some getter\setter methods
}

当我提交表单而不在字段中放置值时,它会向我显示每个错误(这是对的),但也显示一个启动的错误,甚至在其他错误之前!isPasswordLegal()

我错过了什么?谢谢大家!


答案 1

错误显示在其他错误之前的原因是,您将其用作方法验证程序,并且 Symfony 将错误消息分配给表单实例而不是表单字段。

编辑:

所有表单都提供error_mapping选项,允许您定义错误消息的显示位置。

在你的情况下,它看起来像这样:

$options = array(
    'validation_groups' => array('signup','strict'),
    'error_mapping' => array(
        'isPasswordLegal' => 'password',
    ),
);
$form = $this->createFormBuilder($user, $options)
    ->add('name', 'text')
    ->add('email', 'text')
    ->add('password', 'password')
    ->add('signup', 'submit')
    ->getForm();

答案 2

推荐