Php Symfony2 controller for AJAX提交表单中的访问错误

Php Symfony2 controller for AJAX提交表单中的访问错误,php,doctrine-orm,symfony,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 我遇到

问题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返回?

问题1 错误不在表单本身上
Form::getErrors
仅当表单对象本身存在任何错误时才会返回错误。您需要遍历表单并检查每个子项上的错误

Form::isValid
相反,只需遍历子项并检查其中是否有无效项

问题2 如果验证后仍然存在“错误”,则表示您的验证未完成。如果您的应用程序需要非标准约束,您应该继续编写自定义约束。有关更多信息,请参阅。

问题1 在表单生成器中,您可以使用
错误\u冒泡
将错误移动到表单对象中。指定字段时,将其作为选项传入,如下所示:

$builder->add('username','text', array('error_bubbling'=>true));
$form->getErrors();
您可以访问表单对象中的错误,如下所示:

$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,
    ),
  )),
) [] []
仅供参考:如果您使用表单/类型,则不能将
错误\u冒泡设置为默认值,必须将其分配给每个字段

有用链接:

问题2

验证器如何知道有人已经在表中使用了该用户名?我认为验证器检查的是数据是否正确,而不是数据是否已经存在,或者它是否同时做这两件事?验证器可以执行任何类型的验证。当然,正如已经提到的,已经有了唯一性的验证器,uniquentity。