Symfony2:在重复字段上获取表单验证错误

时间:2012-12-12 16:39:16

标签: php symfony

我设置了一个非常基本的表单来注册用户(用户名+密码)。我想在我的控制器中得到验证错误。

我找到了两种方法:

// In my controller:
$user = new User();
$form = $this->createForm(new UserType, $user);

$request = $this->get('request');

if($request->getMethod() == 'POST') {
     $form->bind($request);

     if($form->isValid()) {
         // save user in DB
     } else {
         // First way
         $errors = $this->get('validator')->validate($user);

         // OR
         $errors = $form->getErrors();
     }
 }

如果我在表单中输入的用户名太短,则两种方法都有效(在此字段上存在约束MinLength)。但是,如果我输入两个不同的密码,表单无效且$ form-> getErrors()或$ this-> get('validator') - > validate($ user)中没有消息错误。如何收到此错误消息?

以下是我构建表单的方式

$builder->add('username', 'text', array(
    'attr' => array(
       'placeholder' => 'Choose an username'
    ),
    'label' => 'Username *',
    'error_bubbling' => true,
));

$builder->add('password', 'repeated', array(
    'type' => 'password',
    'invalid_message' => 'The password fields must match.',
    'required' => true,
    'first_options'  => array(
        'label' => 'Password',
        'attr' => array('placeholder' => 'Enter password')
    ),
    'second_options' => array(
        'label' => 'Repeat Password',
        'attr' => array('placeholder' => 'Retype password')
    ),
    ));

2 个答案:

答案 0 :(得分:3)

为什么要在控制器中收到此消息?

无论如何,您必须为'password'字段类型调用getErrors()。 这应该会给你'The password fields must match.'错误。

$passwordErrors = $form->get('password')->getErrors();

foreach ($passwordErrors as $key => $error) {
      $message .= $error->getMessageTemplate(). '<br/>';
}

error_bubbling选项用于将给定字段的任何错误传递给父字段或表单。在您的示例中,error_bubbling的{​​{1}}设置为true,因此您可以通过在父元素(此处为$ form)上调用getErrors()来获取用户名字段验证错误消息。除非您为此特定字段将username选项设置为true,否则密码重复字段不是这种情况。

答案 1 :(得分:1)

在我的情况下,这是经过多次尝试后的最终解决方案......

FIRST:设置为false error_bubbling(或不设置,因为false是默认值)。

SECOND:使用以下代码获取field =&gt; error_message数组。

    $errors = array();
    foreach ($form->all() as $child) {
        $fieldName = $child->getName();
        $fieldErrors = $form->get($child->getName())->getErrors(true);

        foreach ($fieldErrors as $fieldError){
            $errors[$fieldName] = $fieldError->getMessage();
        }
    }

此代码适用于Symfony 3.4 / 4.1