我正在失去Symfony2中表单字段的错误关联

ed2*_*209 7 php ajax symfony doctrine-orm

我的验证看起来像

Acme\UserBundle\Entity\User:
    constraints:
        - \Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: { fields:username, message: "Username already in use" }
        - \Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: { fields:email, message: "Email address already in use" }
    properties:
        username:
            - NotBlank: ~
            - MinLength: { limit: 2, message: "Your username must have at least {{ limit }} characters." }
        email:
            - Email:
                message: The email "{{ value }}" is not a valid email.
                checkMX: true
Run Code Online (Sandbox Code Playgroud)

我的控制器像:

$form = $this->createForm(new RegistrationType());
$form->bindRequest($request);
if ($form->isValid()) {
    //... save to db
}else{
    $errors = $form->getErrors();
    //... pass the errors back as json
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试构建通过ajax请求提交的用户注册控制器.但是,当触发验证错误时,$error变量如下所示:

[2011-11-07 19:19:44] app.INFO: array (
  0 => 
  Symfony\Component\Form\FormError::__set_state(array(
     'messageTemplate' => 'Email address already in use',
     'messageParameters' => 
    array (
    ),
  )),
  1 => 
  Symfony\Component\Form\FormError::__set_state(array(
     'messageTemplate' => 'Your username must have at least {{ limit }} characters.',
     'messageParameters' => 
    array (
      '{{ value }}' => '1',
      '{{ limit }}' => 2,
    ),
  )),
) [] []
Run Code Online (Sandbox Code Playgroud)

问题是我不知道错误对应哪个字段.有没有办法找到这些数据,这样当我发送json响应时,我可以将错误消息与相关字段相关联.

Kas*_*een 6

我认为您可以单独查询每个字段,例如:

$form->get('username')->getErrors()

所以你可以这样建立一个数组:

$errors['username'] = $form->get('username')->getErrors();
$errors['email'] = $form->get('email')->getErrors();
Run Code Online (Sandbox Code Playgroud)

您可以自动执行以下操作:

$fields = $form->getChildren();
foreach ( $fields as $field ) {
    $errors[$field->getName()] = $field->getErrors();
}
Run Code Online (Sandbox Code Playgroud)

我认为该getName函数应该在自己的表单的子项上调用时返回字段名称.其他人可能有更有效的方式......

  • 禁用错误冒泡.基本上,表单的整体自身存在错误,其子字段的错误,错误冒泡会使字段的所有错误都转到顶层(表单).一旦你禁用错误冒泡,你可以重新测试`$ form-> getErrors()`,看看它是否为你提供了你正在寻找的关联数组,否则我的解决方案应该可行.`$ builder->添加( '用户名', '文本');` (6认同)