Symfony2中组序列验证器的问题

Posted

技术标签:

【中文标题】Symfony2中组序列验证器的问题【英文标题】:Issue on Group Sequence Validator in Symfony2 【发布时间】:2013-09-23 14:51:29 【问题描述】:

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

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

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

我的意思是,我有相同的 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() 启动的错误,甚至在其他错误之前!

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

【问题讨论】:

如果从表单中删除组会怎样? 如果您的意思是从 createFormBuilder 函数中删除 validation_groups 数组,它不会检查“注册”组属性。 我刚刚检查过 - 它在这里工作。难道你不会同时有一个带有符号的 YML 映射吗? 【参考方案1】:

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

编辑:

所有表单都提供error_mapping option,让您可以定义错误消息的显示位置。

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

$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();

【讨论】:

以上是关于Symfony2中组序列验证器的问题的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 自定义身份验证:用户登录但未通过身份验证

在 Core 之外使用 Symfony2 验证器注解

如何在 symfony2 验证器中允许空值

Symfony2 表单验证器 - 在刷新之前比较旧值和新值

Symfony2 - 如何验证控制器中的电子邮件地址

symfony2 中的复选框验证