【问题标题】:Symfony2 : dependency between validation assertsSymfony2:验证断言之间的依赖关系
【发布时间】:2012-04-03 15:34:33
【问题描述】:

我有一个带有字段的经典表单:“用户名”、“密码”和“生日”。

这是我的验证断言(在我的用户实体中):

.....

/**
 * @var string
 * @Assert\NotBlank(message="username.error.blank")
 * @Assert\MinLength(limit="2", message="username.error.short")
 */
protected $username;

/**
 * @var string
 * @Assert\NotBlank(message="password.error.blank")
 * @Assert\MinLength(limit="4", message="password.error.short")
 */
protected $password;

/**
 * @Assert\True(message="password.error.different")
 */
public function isPasswordLegal()
{
    return ($this->username != $this->password);
}

问题是当我提交表单时它完全是空的:

  • 'username' : 错误消息,因为它是空白的 (ok)
  • 'password' : 错误消息,因为它是空白的 (ok)
  • 'password':错误信息,因为它与用户名相同(这是问题!)

那么,两个问题:

  1. 如何解决这个“显示”问题?
  2. 如何使用 {{ form_errors(form.password) }} 在“密码”字段旁边显示此消息?

感谢您的帮助:-)

奥雷尔

【问题讨论】:

    标签: symfony symfony-forms


    【解决方案1】:

    答案 1:使用GroupSequence

    /**
     * @Assert\GroupSequence({"User", "Strict"})
     */
    class User
    {
        /**
         * @Assert\True(message="password.error.different", groups="Strict")
         */
        public function isPasswordLegal()
        {
            return ($this->username != $this->password);
        }
    

    这将首先验证“用户”组中的所有约束。只有当该组中的所有约束都有效时,才会验证第二组“Strict”,我将您的自定义验证方法添加到该组中。

    为了解释,为什么“用户”包含所有其他约束,我需要详细说明一下:

    1. 没有明确设置groups 的每个约束都属于组“默认”
    2. 属于组“Default”的每个约束也属于组“{ClassName}”,即与定义约束的类(在本例中为“User”)类似的组。
    3. 当您验证组“{ClassName}”中的对象时,组“{ClassName}”中的所有约束都会被验证(即组“Default”中的所有约束)
    4. 当您验证“默认”组中的对象时,“默认”组中的所有约束都会被验证,除非:
      • 该类定义了一个组序列。在这种情况下,组序列中的组将按顺序进行验证。

    因此,组序列不能包含组“默认”(这将创建一个循环),而是需要包含组“{ClassName}”。

    答案 2:使用“error_mapping”选项(仅适用于最新的 Symfony 主机)。

    class UserType
    {
        public function getDefaultOptions()
        {
            return array(
                'data_class' => '...\User',
                'error_mapping' => array(
                    'passwordLegal' => 'password',
                ),
            );
        }
    }
    

    【讨论】:

      【解决方案2】:

      A1。这个很简单,虽然我想它可能有点多余:

      public function isPasswordLegal()
      {
          // This is okay because the isBlank assert will fail
          if (!$this->password) return true;
      
          return ($this->username != $this->password);
      }
      

      A2。就显示而言,类似于:

       {{ form_label (form.username) }}{{ form_widget(form.username) }}{{ form_errors(form.username) }}
      
       {{ form_label (form.password) }}{{ form_widget(form.password) }}{{ form_errors(form.password) }}
      

      根据需要设置样式。

      【讨论】:

      • 几乎完美。 A1 是好的,但是 A2 没有显示与密码字段接近的方法“isPasswordLegal”相关的错误消息...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多