如何使用symfony formbuilder显示必填字段错误(验证)消息?

时间:2018-11-21 11:10:59

标签: json symfony twig formbuilder requiredfieldvalidator

PagesController.php

$id = $request->request->get('id');
$target = $request->request->get('target');
$EntityName = 'App\\Entity\\' . ucwords($slug);

$em = $this->getDoctrine()->getManager();
$cmf = $em->getMetadataFactory();
$classes = $cmf->getMetadataFor($EntityName);


if($request->request->get('target')){

  $item = new $EntityName();
  $item= $this->getDoctrine()->getRepository($EntityName)->find($id);

  $formBuilder = $this->createFormBuilder($item);

  foreach ($classes->fieldMappings as $fieldMapping) {
      $formBuilder->add($fieldMapping['fieldName'], TextType::class, array('attr' => array('class' => 'form-control'), 'required'   => true,));
  }

  $formBuilder->add('cancel', ButtonType::class, array('label' => 'Cancel','attr' => array('class' => 'cancel form-btn btn btn-default pull-right close_sidebar close_h')))
  ->add('save', SubmitType::class, array('label' => 'Save','attr' => array('id' => 'submit-my-beautiful-form','class' => 'form-btn btn btn-info pull-right','style' => 'margin-right:5px')));
  $form = $formBuilder->getForm();

  $form->handleRequest($request);


  $response = new JsonResponse(
    array(
      'message' => 'Success',
      'output' => $this->renderView('form.html.twig',
      array(
        'target' => $target,
        'entity' => $item,
        'form' => $form->createView(),
      ))), 200);
      return $response;



} else {

   $em = $this->getDoctrine()->getManager();
    foreach ($classes->fieldMappings as $fieldMapping) {
      $func = 'set'.$fieldMapping['fieldName'];
      $args = $data['form['.$fieldMapping['fieldName'].']'];
      $entity->$func($args);
    }
   $em->persist($entity);
   $em->flush();
  $response = new JsonResponse(array('id' => $data['form[id]']), 200);
  return $response;
}

form.html.twig

<section class="content-header" style="margin-bottom:20px">
  <h1 style="float:left;margin-bottom:30px">Create Entry </h1>
</section>
<section class="content" style="clear:left">
  <div class="form-group">
    {{ form_start(form) }}
    {{ form_end(form) }}
  </section>

我的表单运行良好,当我填写该表单并按“保存”按钮时,该表单存储在数据库中。 当我将所有字段留空并按“保存”时,什么也没有发生,并且出现500错误

  

执行'INSERT INTO成员(用户名,   密码,电子邮件,is_active)带有参数[“”的VALUES(?,?,?,?)'   null,“”,“ 1”]:

     

SQLSTATE [23000]:违反完整性约束:1048列   “密码”不能为空

这真的很好,因为必填字段是必需的,但是即使我添加了“ required” =“ true”,错误也不会显示在表单中。

1 个答案:

答案 0 :(得分:1)

因此,在使用表单构建器时,您可以访问:

$form->isSubmitted()

$form->isValid()

因此,您可以执行以下操作:

if ($form->isSubmitted() && $form->isValid()) {
    // save to database
}

我们要先检查表单是否提交,再检查表单是否有效,就像没有提交表单一样,因为表单将为假,因此不必检查表单是否有效。

这将防止您的MySQL错误,因为技术上您的表单无效,并且您尝试刷新无效数据。显然,我们只想保存有效的数据。

当然,如果表单失败,您可以返回视图,并且可以在模板中访问

{{ form_errors() }}

这可能满足您的需求,但您也可以将类似的内容传递给模板

'formHasErrors' => $form->isSubmitted() && !$form->isValid(),

然后在您的模板中

{% if formHasErrors %}

您可能想做的其他事情,这使您可以更好地控制字段,将字段分开,如下所示:

{{ form_start(form) }}
    {{ form_label(form.name) }}
    {{ form_errors(form.name, {'attr': {'class': 'form-input'}}) }}
    {{ form_widget(form.name) }}
{{ form_end(form) }}

捕捉错误并正确处理它们非常重要。您的实现未验证表单是否有效,这就是为什么您会收到500个错误的原因。