用于AJAX提交表单的Symfony2控制器中的访问错误

时间:2011-11-06 18:56:57

标签: php doctrine-orm symfony

问题1

我想通过ajax提交建立一个注册表。注册工作是$form->isValid()。但是,如果表单未能注册,我需要通过ajax返回这些错误。

if ($form->isValid()) {

}else{
    $errors = $form->getErrors();
    // return some json encoded errors here
}

$form->getErrors()返回一个空数组,即使表单没有验证(在这种情况下我使用的用户名太短了)。

问题2

我遇到的第二个问题是,如果表单验证但仍然存在错误。例如,某人尝试为其提交相同值的唯一字段。

if ($form->isValid()) {

    $em = $this->getDoctrine()->getEntityManager();
    $em->persist($form->getData());
    $em->flush();

    // error could be a username submitted more than once, username is unique field

}else{
    // ...
}

如何捕获该错误并通过json返回?

2 个答案:

答案 0 :(得分:7)

问题1

在表单构建器中,您可以使用error_bubbling将错误移动到表单对象中。指定字段时,将其作为选项传递,如下所示:

$builder->add('username','text', array('error_bubbling'=>true));

您可以像这样访问表单对象中的错误:

$form->getErrors();

输出类似

的内容
array (
  0 => 
  Symfony\Component\Form\FormError::__set_state(array(
     'messageTemplate' => 'Your username must have at least {{ limit }} characters.',
     'messageParameters' => 
    array (
      '{{ value }}' => '1',
      '{{ limit }}' => 2,
    ),
  )),
) [] []

fyi:如果您使用的是表单/类型,则无法将error_bubbling设置为默认值,必须将其分配给每个字段。

有用的链接:http://symfony.com/doc/2.0/reference/forms/types/text.html#error-bubbling

问题2

http://symfony.com/doc/2.0/reference/constraints/UniqueEntity.html

答案 1 :(得分:4)

问题1

错误不在表单上。如果表单对象本身有任何错误,Form::getErrors只会返回错误。您需要遍历表单并检查每个孩子的错误。

相反,

Form::isValid只是遍历孩子并检查他们是否有效。

问题2

如果验证后仍有“错误”,则表示您的验证未完成。如果您的应用程序需要非标准约束,那么您应该继续编写自定义约束。有关详细信息,请参阅the cookbook entry on writing custom validator constraints