Forms Symfony2无效表单,无错误
我对Symfony2生成的积垢表单有问题。 (与MongoDB文档,但我不认为这是相关的) 在控制器的createAction()方法中,调试表单结果时:Forms Symfony2无效表单,无错误,forms,validation,symfony,symfony2.3,symfony2.5,symfony2.6,Forms,Validation,Symfony,Symfony2.3,Symfony2.5,Symfony2.6,我对Symfony2生成的积垢表单有问题。 (与MongoDB文档,但我不认为这是相关的) 在控制器的createAction()方法中,调试表单结果时: $form->isValid() // returns false $form->getErrors() // returns en empty array(0) {} 因此,在我的小树枝模板上使用form\u errors(form)不会得到任何东西(这似乎很正常,因为$form->getErrors()空返回) 并且书面值
$form->isValid() // returns false
$form->getErrors() // returns en empty array(0) {}
因此,在我的小树枝模板上使用form\u errors(form)
不会得到任何东西(这似乎很正常,因为$form->getErrors()
空返回)
并且书面值不会以…的形式替换
有人有想法吗?看来您有验证问题。表单在提交时未进行验证。我假设您正在使用注释进行验证。确保在实体的顶部有这个
use Symfony\Component\Validator\Constraints as Assert;
这也是每个属性上面的内容
/**
* @Assert\NotBlank()
*/
NotBlank()
可以更改为任何约束以满足您的需要
有关验证的更多信息,请访问:
有关断言约束的更多信息,请访问:
首先要了解的是验证是在模型上进行的,而不是表单上。表单可以包含错误,但前提是它有一个映射到未验证属性的字段。因此,如果表单不包含无效字段(可能是对表单中不存在的属性的
NotNull
断言),它将不会显示错误
第二件事是,
$form->getErrors()
只显示该级别的错误,每个表单子级可以包含自己的错误。因此,如果您想要检查错误,您应该在字段中循环,并在每个字段上调用getErrors。表单类上的getErrors
方法可能会以这种方式进行欺骗。要调试表单,请使用$Form->getErrorsString()
而不是$Form->getErrors()
$form->getErrorsString()
只应用于调试表单…它将包含每个子元素的错误,而不是$form->getErrors()
的情况
正如Peter提到的,$form->getErrors()
不会返回子窗体所有错误的总和
要了解表单如何无效并使getErrors()返回空数组,可以查看symfony表单类的方法。如您所见,表单无效的情况有两种,第一种是针对常规表单的测试,第二种是针对每个子元素的测试
公共函数有效()
{
//...
//案例一:如果子元素有错误,$this->ERRORS将包含
//子元素上的错误,而不是常规“错误”字段上的错误
//本身
如果(计数($this->errors)>0){
返回false;
}
//案例二:这就是为什么我们也在测试子元素
//检查是否存在有效的
如果(!$this->isDisabled()){
foreach($this->childrenas$child){
如果(!$child->isValid()){
返回false;
}
}
}
返回true;
}
因此,每个表单子级可以包含一个错误,但是
$form->getErrors()
本身不会返回所有错误。考虑到一个有很多子元素的表单,如果CSRF不正确,通常会有$form->getErrors()和CSRF错误。对于我来说,表单没有提交,即使我有一个提交按钮。
我添加了代码来解决这个问题
$request = $this->get('request');
if($request->isMethod("POST")){
$form->submit($request);
if($form->isValid()){
// now true
}
}
我也有同样的问题。对我来说,表单无效,但使用
$form->getErrors()
或$form->getErrorsString()
无法获取任何错误。后来我发现我忘了将CSRF令牌传递给表单,所以它不会被提交,而$form->handleRequest($request)
什么也没做(没有验证)。当我看到@pit的答案时,我尝试使用
$form->submit($request);
$form->getErrorsAsString();
它返回了一个错误:
错误:CSRF令牌无效。请尝试重新提交表单
以下是Symfony2文档中的一些说明:Symfony 2.6的更新
因此,根据您的Symfony2版本:
截至,已弃用getErrorsAsString()
函数(将在Symfony3中删除),您应使用以下方法:
die((string) $form->getErrors()); // Main errors
die((string) $form->getErrors(true)); // Main and child errors
从开始,如果已激活调试包
,则也可以使用转储
(开发环境)功能:
dump((string) $form->getErrors()); // Main errors
dump((string) $form->getErrors(true)); // Main and child errors
如果您是通过AJAX发送数据,您可能没有将表单名称包含在数据键中,因此您是 这意味着,在尝试处理请求时,请求处理机制在GET/POST数据(表示数组)中找不到表单名称 以常规方式呈现表单时,其每个字段都将表单名称作为前缀包含在其名称属性
my\u form[child\u field\u name]
中
使用ajax时,在数据中添加表单名称作为前缀
data : {
"my_form" : {
"field_one" : "field_one_value"
...
}
}
对
这是正确的,它说的是彼得·克鲁特霍夫
在SF 2.8中,这是我的函数,用于获取字段的错误
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()) {
...
从Symfony 3开始,根据文档,您应该使用新的实现:
$errors=(string)$form->getErrors(true,false)代码>
这将以一个字符串的形式返回所有错误 对于Symfony(>=3.2-4),您可以使用:
foreach($form->getErrors(true, false) as $er) {
print_r($er->__toString());
}
查看明显的错误。您是否可以编辑问题以包含validation.xml或验证注释。我正在使用MongoDB,因此我没有实体,只有文档。并在我的文档类文件上准备好这一行,否则我会得到另一个PHP错误或警告;)我想我的错误来自于这个注释,因为我的表单上有文件字段。。。我稍后会试试这个。非常感谢。我不知道,谢谢,我想我已经找到答案了。我试试看!如果你这样做了,请将此标记为已接受的答案,以便其他有此问题的人也能从中受益。我有同样的问题,我使用createF
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()) {
...
foreach($form->getErrors(true, false) as $er) {
print_r($er->__toString());
}