我有一个Symfony2生成的CRUD表单的问题。(使用MongoDB文档,但我不认为这与此相关)
在我的控制器的createAction()方法中,当我调试表单结果时:
$form->isValid() // returns false
$form->getErrors() // returns en empty array(0) {}
所以,我在我的树枝模板上使用form_errors(form)
没有得到任何东西(由于返回$form->getErrors()
为空,这看起来很正常)
并且写入的值不会被替换为...
有谁有主意吗?
发布于 2012-06-28 03:47:01
首先要理解的是,验证是在模型上完成的,而不是在表单上。表单可以包含错误,但前提是它有一个字段映射到未验证的属性。因此,如果表单不包含无效字段(可能是表单中不存在的属性上的NotNull
断言),则不会显示错误。
第二件事是$form->getErrors()
将只显示该级别的错误,每个子窗体都可以包含自己的错误。因此,如果您想检查错误,应该遍历字段并对每个字段调用getErrors。Form类上的getErrors
方法可以通过这种方式进行欺骗。
发布于 2012-12-29 17:32:50
若要调试窗体,请使用$form->getErrorsAsString()
而不是$form->getErrors()
。
$form->getErrorsAsString()
应该只用于调试,form...it将包含每个子元素的错误,这不是$form->getErrors()
的情况。
正如Peter提到的,$form->getErrors()
不会返回子表单所有错误的总和。
为了理解表单是如何无效的,并让getErrors()返回一个空数组,您可以查看symfony form类的isValid()方法。如您所见,有两种情况下表单无效,第一种是针对一般表单的测试,第二种是针对每个子元素的用例测试。
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()。
发布于 2017-10-18 17:35:22
对于Symfony (>= 3.2 - 4),您可以使用:
foreach($form->getErrors(true, false) as $er) {
print_r($er->__toString());
}
来查看明显的错误。
https://stackoverflow.com/questions/11208992
复制相似问题