Symfony2: $form->isValid() 总是返回 true


Symfony2: $form->isValid() always returning true

我在Symfony表单验证(使用Silex(时遇到了问题。我有一个密码重置表单的repeated输入,如果两个密码匹配,它可以正常工作。但是,如果他们不这样做,$form->isValid()仍然返回 true。 $form->getErrorsAsString()也是空的。经过大量的谷歌搜索并阅读了许多或多或少相关的问题的答案,我仍然没有找到解决方案。

更新:从我的Git存储库中检查出各种版本后,当我将Symfony从版本2.5.7更新到昨天发布的版本2.6.0时,我最终发现该功能坏了。我查看了更新日志,没有看到任何会破坏这一点的东西。我暂时切换回来,但最终希望能够使用版本 2.6.0 ...

这是为我的PasswordResetType定义buildForm方法:

function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('password', 'repeated', array(
                'type' => 'password',
                'invalid_message' => $this->app['translator']->trans('form_errors.pass_must_match'),
                'required' => true,
                'first_options' => array(
                    'constraints' => array(
                        new Assert'NotBlank()
                    ),
                ),
                'second_options' => array(
                    'constraints' => array(
                        new Assert'NotBlank()
                    )
                )
            ))
        ;
    }
}

与我的表单关联的 Twig 模板:

{{ form_start(form) }}
    {{ form_widget(form._token) }}
    {{ form_errors(form) }}
    <div class="form-group">
        {{ form_label(form.password.first, 'user.new_password'|trans, {'label_attr': {'class': 'control-label'}}) }}
        {{ form_errors(form.password.first) }}
        {{ form_widget(form.password.first, {'attr': {'class': 'form-control', 'placeholder' : 'user.new_password'|trans}}) }}
    </div>
    <div class="form-group">
        {{ form_label(form.password.second, 'user.new_password_confirmation'|trans, {'label_attr': {'class': 'control-label'}}) }}
        {{ form_errors(form.password.second) }}
        {{ form_widget(form.password.second, {'attr': {'class': 'form-control', 'placeholder' : 'user.new_password_confirmation'|trans}}) }}
    </div>
    <button type="submit" class="btn btn-primary btn-block">{{'user.reset_password'|trans}}</button>
{{ form_end(form) }}

关联的控制器:

$app->get('/{_locale}/reset_password/{token}', function(Request $request, $token) use ($app) {
    /* ... */
    $form = $app['form.factory']->createBuilder(new PasswordResetType($app), array())->getForm();
    return $app['twig']->render('password_reset.twig', array(
        'title' => 'Page title',
        'form' => $form->createView()
    ));
})->bind('reset_password');
$app->post('/{_locale}/reset_password/{token}', function(Request $request, $token) use ($app) {
    /* ... */
    $form = $app['form.factory']->createBuilder(new PasswordResetType($app), array())->getForm();
    $form->handleRequest($request);
    if ($form->isValid()) {
        $data = $form->getData();
        $password = $data['password']; // this is line 113
        /* ... */
    }
});

当密码不匹配时,这将生成以下错误:Error: ContextErrorException in controllers_users.php line 113: Notice: Undefined index: password 。这表示$form->isValid()返回了true,而它不应该返回,因为密码不匹配。

更新:我打开了一个错误报告:https://github.com/symfony/symfony/issues/12792

这最终成为Symfony中的一个错误,在2.6.6版本中得到了修复。有关更多信息,请参阅我在 GitHub 上的错误报告。