表单字段验证顺序

时间:2013-07-28 16:43:00

标签: forms validation symfony constraints

这是绑定到表单的实体。

validation.yml

My\Bundle\Entity\User:
    properties:
        login:
            - NotBlank:
                message: "Login is empty."
            - Length:
                min: 3
                max: 16
            - My\Bundle\Validator\Constraints\Alphanumeric: ~

这里是一个未绑定的字段

RegisterType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('login', 'text', array('label' => 'Login'));
    ...
    $builder->add('captcha', 'captcha', array(
        'label'       => 'Captcha',
        'mapped'      => false,
        'constraints' => array(new ContainsCaptcha)
    ));
}

检查错误

MyController.php

$formFields = $form->all();
foreach ($formFields as $key => $field) {
    if ($field->getErrorsAsString()) {
        $errors = $field->getErrors();
        foreach ($errors as $error) {
            $messages[$key][] = $error->getMessage();
        }
    }
}
var_dump($messages);

验证码不会像其他人一样验证。 它可能有错误,其他字段只有一个可能会出错。

我认为有两种选择是正确的:

1 /同时获取所有无效字段的错误(登录,电子邮件,...,验证码)

2 /如果登录或其他已经失败,则不验证验证码

怎么做?

此外,登录始终首先得到验证。更改validation.yml或buildForm()中的声明顺序不会更改任何内容。我想这取决于Entity.orm.yml声明顺序。如何在不改变实体元数据的情况下更改此订单。

2 个答案:

答案 0 :(得分:0)

你可以尝试:

$user = new User();

$validator = $this->get('validator');
$errors = $validator->validate($user);

if (count($errors) > 0) {
    return new Response(print_r($errors, true));
} else {
    return new Response('The author is valid! Yes!');
}

答案 1 :(得分:0)

我改变了一些验证,也许它修复了一些东西,但大多数肯定错误检索是有缺陷的。 修复了这个问题 - Symfony2 repeated type does not validate