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()); }
明显地看到错误。