Forms Symfony2无效表单,无错误

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()空返回) 并且书面值

我对Symfony2生成的积垢表单有问题。 (与MongoDB文档,但我不认为这是相关的)

在控制器的createAction()方法中,调试表单结果时:

$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());
}