要调试表单,请使用$form->getErrorsAsString()
而不是$form->getErrors()
.
$form->getErrorsAsString()
应该只用于调试表单...它将包含每个子元素的错误,而$form->getErrors()
.
正如彼得所提到的,$form->getErrors()
不会返回子表单的所有错误的总和。
要了解表单如何无效并让 getErrors() 返回一个空数组,您可以查看 symfony 表单类的isValid()方法。如您所见,有 2 种情况下表单无效,第一种测试通用表单,第二种情况测试每个子元素。
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 不正确,您通常会遇到带有 CSRF 错误的 $form->getErrors()。