没有createFormBuilder的Symfony2表单验证

时间:2014-03-11 09:10:15

标签: symfony symfony-2.4

我正在尝试验证我在 .twig 文件中创建的表单。我不是使用createFormBuilder创建表单。这是我的控制器代码,在提交表单之后调用视图2的两个案例 1)。

public function cart_newAction(Request $request)
 {      
    $entity = new Product();
    $errors = '';
    if ($request->getMethod() == 'POST') 
    {
        $validator = $this->get('validator');
        $errors = $validator->validate($entity);
        if (count($errors) > 0) {
            echo 'Error';
        } 
        else {
            echo 'Success';             
        }
    }
    return $this->render('CartCartBundle:Cart:Add.html.twig', array('errors' => $errors ));
}

这是视图文件,我显示的是这样的错误 的 Add.html.twig

{% for error in errors %}
    {{error}}
{% endfor %}

我在validation.yml文件中设置了不能为空的名称的错误。 所以现在当我运行视图页面时,它每次都会在我提交表单后显示错误。 如果没有错误,则不应显示错误,只显示空白错误。

Note:有没有更好的方法可以做到这一点所以请分享一下。记住我在没有createFormBuilder的情况下这样做 的更新 它总是显示Error.Even如果我的表单有效并且没有遗漏任何字段。

3 个答案:

答案 0 :(得分:1)

如果您想自己制作表单,则无法使用Syfmony表单验证器对其进行验证。您需要使用简单的PHP验证服务器端。像这样的东西

if ($request->getMethod() == 'POST') 
{
    $username = $_POST['username'];
    if ($username == '')
    {
       // set error message here
    } 
}

答案 1 :(得分:1)

好,让我说清楚。我要给您两个解决方案,第一个是最好,最正确的方法: 1)生成您的EntityForm类型:bin/console make:formd:g:form命令。 2)然后只需添加几行即可提交并获取错误。

 public function cart_newAction(Request $request)
 {      
    $entity = new Product();
    $form = $this->createForm(EntityType::class, $entity);
    $form->submitForm($request->request->all(), false);

    if ($request->getMethod()->isPost()) 
    {
    if ($form->isValid()) {
            echo 'Error';
        } 
        else {
            echo 'Success';             
        }
    }
    return $this->render('CartCartBundle:Cart:Add.html.twig', [
         'errors' => $form->getErrors(),
    ]);
}

第二种解决方案是将数据绑定到实体对象,因为我们需要将数据设置到对象中。

1)第一步,在当前类中创建一个private功能,以绑定所有提交的数据:

private function bindEntityValues(Product $entity, array $data) {
  foreach ($data as $key => $value){
    $funcName = 'set'+ucwords($key);
    if(method_exists($entity, $funcName)) $entity->$funcName($value);
  }
}

然后您的cart_newAction应该是这样的:

 public function cart_newAction(Request $request)
 {      
    $entity = new Product();
    $this->bindEntityValues(entity, $request->request->all());
    $errors= $this->get('validator')->validate($entity)

    if (count($errors) > 0) {
            echo 'Error';
        } 
        else {
            echo 'Success';             
        }
    }
    return $this->render('CartCartBundle:Cart:Add.html.twig', ['errors' => $errors]);
}

希望这有助于您有一个清晰的视野。

答案 2 :(得分:0)

您必须检查$errors是否为空:

if (count($errors) > 0) {
    return $this->render('CartCartBundle:Cart:Add.html.twig', array('errors' => $errors ));
} else {
    return $this->render('CartCartBundle:Cart:Add.html.twig');
}

请参阅文档here