Symfony2无效的表单没有错误

我遇到了Symfony2生成的CRUD表单的问题。 (使用MongoDB文档,但我不认为这是相关的)

在我的控制器的createAction()方法中,当我debugging窗体结果时:

$form->isValid() // returns false $form->getErrors() // returns en empty array(0) {} 

所以,我没有得到任何使用form_errors(form)我的树枝模板(这似乎是正常的,因为$form->getErrors()空返回)

而书面的价值观并没有被取代

有没有人有一个想法?

首先要理解的是validation是在模型上进行的,而不是forms。 表单可以包含错误,但仅当它有一个字段映射到不validation的属性时。 因此,如果您的表单不包含无效的字段(可能是不属于表单的属性的NotNull断言),它将不会显示错误。

第二件事是$form->getErrors()将只显示该级别的错误,每个表单子可以包含自己的错误。 所以,如果你想检查错误,你应该遍历字段,并调用每个字段的getErrors。 Form类的getErrors方法可能是这样欺骗的。

要debugging表单,请使用$form->getErrorsAsString()而不是$form->getErrors()

$form->getErrorsAsString()应该只用于debugging窗体…它将包含每个子元素的错误,这不是$form->getErrors()

正如Peter提到的, $form->getErrors()不会返回子窗体所有错误的总和。

要理解一个表单可以是无效的,并有一个返回一个空数组的getErrors(),你可以看看symfony表单类的isValid()方法。 正如你所看到的,有两种情况是表单无效,第一种是针对一般表单的testing,第二种是针对每个子元素的情况testing。

 public function isValid() { //... //CASE I : IF CHILD ELEMENTS HAVE ERRORS, $this->errors WILL CONTAIN //THE ERROR ON THE CHILD ELEMENT AND NOT ON THE GENERAL 'errors' FIELD //ITSELF if (count($this->errors) > 0) { return false; } //CASE II: AND THIS IS WHY WE ARE TESTING THE CHILD ELEMENTS AS WELL //TO CHECK WHETHER THERE ARE VALID OR NOT if (!$this->isDisabled()) { foreach ($this->children as $child) { if (!$child->isValid()) { return false; } } } return true; } 

因此,每个表单子可以包含一个错误,但$form->getErrors()本身不会返回所有的错误。 考虑到有许多子元素的表单,如果CSRF不正确,通常会有$ form-> getErrors()和CSRF错误。

更新Symfony 2.6

那么取决于你的Symfony2版本:

symfony2.3

 die($form->getErrorsAsString()); 

从symfony2.5开始 , getErrorsAsString()函数被弃用(将在Symfony3中被删除),你应该使用下面的方法:

 die((string) $form->getErrors()); // Main errors die((string) $form->getErrors(true)); // Main and child errors 

从symfony2.6开始 ,如果你已经激活了DebugBundle ,你也可以使用dump (dev environment)函数:

 dump((string) $form->getErrors()); // Main errors dump((string) $form->getErrors(true)); // Main and child errors 

我刚刚得到同样的问题。 对我来说,表单是无效的,但是我不能通过使用$form->getErrors()$form->getErrorsAsString()来获得任何错误。 后来我发现我忘记了将CSRF标记传递给表单,所以它不会被提交, $form->handleRequest($request)什么都不做(没有validation)。 正如我看到@坑的答案,我试图使用

 $form->submit($request); $form->getErrorsAsString(); 

它返回一个错误:

错误:CSRF令牌无效。 请尝试重新提交表单。

以下是Symfony2文档中的一些解释: http ://symfony.com/doc/current/book/forms.html#handling-form-submissions

对于我来说,即使我有一个提交button,表格也没有提交。 我添加了代码来解决问题

 $request = $this->get('request'); if($request->isMethod("POST")){ $form->submit($request); if($form->isValid()){ // now true } } 

如果您通过AJAX发送数据 ,您可能错过了在数据键上包含表单的名称,因此是“受害者”…

 # line 100 of Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php // Don't submit the form if it is not present in the request 

这意味着,在尝试处理请求时,请求处理机制在GET / POST数据(即数组)中没有find您的表单名称。

以通常的方式呈现表单时,每个字段都将表单的名称作为其名称属性my_form[child_field_name]的前缀。

当使用Ajax时,添加您的表单的名称作为数据的前缀!

 data : { "my_form" : { "field_one" : "field_one_value" ... } } 

从Symfony 3起,根据文档你应该使用新的实现:

$errors = (string) $form->getErrors(true, false);

这将返回所有错误作为一个string。

是的,这是正确的,它说什么彼得Kruithof在SF 2.8这是我的function,以获得领域的错误

  private function getErrorsForm(\Symfony\Component\Form\Form $form) { $response = array(); foreach ($form as $child) { foreach ($child->getErrors(true) as $error) { $response[$child->getName()][] = $error->getMessage(); } } return $response; } 

我遇到这个错误,发现我忘记“处理”请求。 确保你有这个…

 public function editAction(Request $request) { $form = $this->createForm(new CustomType(),$dataObject); /** This next line is the one I'm talking about... */ $form->handleRequest($request); if ($request->getMethod() == "POST") { if ($form->isValid()) { ... 

看起来你有一个validation问题。 表单在提交时不能validation。 我将假设您正在使用注释进行validation。 确保你在实体的顶部有这个。

 use Symfony\Component\Validator\Constraints as Assert; 

以及每个属性上面的这个

 /** * @Assert\NotBlank() */ 

NotBlank()可以更改为任何约束来满足您的需求。

有关validation的更多信息可以在http://symfony.com/doc/current/book/validation.htmlfind

有关Assert约束的更多信息,请参见: http : //symfony.com/doc/current/book/validation.html#constraints

对于Symfony(> = 3.2 – 4),您可以使用:

 foreach($form->getErrors(true, false) as $er) { print_r($er->__toString()); } 

明显地看到错误。