1

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

我找到了两种方法来做到这一点:

// 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')
    ),
    ));
4

2 回答 2

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中,将 设置为 true username,因此您可以通过在父元素(此处为 $form )上调用 getErrors() 来获取用户名字段验证错误消息。密码重复字段不是这种情况,除非您error_bubbling也将此特定字段的选项设置为 true。

于 2012-12-12T17:09:44.437 回答
1

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

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

第二:使用以下代码获取field=>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

于 2018-02-10T11:24:47.690 回答