Javascript Ajax中的Symfony2表单验证

Javascript Ajax中的Symfony2表单验证,javascript,jquery,ajax,forms,symfony,Javascript,Jquery,Ajax,Forms,Symfony,在某些页面上,我使用bootstrap modals中的表单。我使用Ajax提交表单,并在控制器中进行验证。大多数用户都会正确填写表单,但如果验证失败,表单将重新呈现并发送回用户。 我一点也不喜欢这样,但我找不到更好的方法,因为我无法访问字段的验证错误。是否有人有更好的方法来实现JSON返回的验证错误?如果我理解正确,您有一个表单,需要分别获取每个字段的错误。如果是,请查看\Symfony\Component\Form\Form::getErrorsAsString()&执行以下类型的smth:

在某些页面上,我使用bootstrap modals中的表单。我使用Ajax提交表单,并在控制器中进行验证。大多数用户都会正确填写表单,但如果验证失败,表单将重新呈现并发送回用户。
我一点也不喜欢这样,但我找不到更好的方法,因为我无法访问字段的验证错误。是否有人有更好的方法来实现JSON返回的验证错误?

如果我理解正确,您有一个表单,需要分别获取每个字段的错误。如果是,请查看\Symfony\Component\Form\Form::getErrorsAsString()&执行以下类型的smth:

function getFormErrors($form)
{
    $errors = array();

    // get the form errors
    foreach($form->getErrors() as $err)
    {
        // check if form is a root
        if($form->isRoot())
            $errors['__GLOBAL__'][] = $err->getMessage();
        else
            $errors[] = $err->getMessage();
    }

    // check if form has any children
    if($form->count() > 0)
    {
        // get errors from form child
        foreach ($form->getIterator() as $key => $child)
        {
            if($child_err = getFormErrors($child))
                $errors[$key] = $child_err;
        }
    }

    return $errors;
}

我自己创建了一个函数

public function getFormErrors(Form $form) {
    $errors = $form->getErrors();
    foreach ($form->all() as $child) {
        foreach ($child->getErrors() as $key => $error) {
            $template = $error->getMessageTemplate();
            $parameters = $error->getMessageParameters();

            foreach ($parameters as $var => $value) {
                $template = str_replace($var, $value, $template);
            }

            $errors[$child->getName()][] = $template;
        }
    }
    return $errors;
}

我今天也有同样的问题

我用ajax发送了表单,如果我的控制器发送给我的不是json“OK”,那么表单将用控制器发送的新表单刷新,该控制器包含错误。当form->isValid()时发送数据“OK”,否则返回表单呈现

HTML:

<div class="form_area">
     <form id="myform" action.... >
           ...code form ...
     </form>
</div>
use Symfony\Component\HttpFoundation\JsonResponse;

public function myEditAction(){
    .......
    if ( $request->getMethod() == 'POST' ) {
        $form->bind($request);

        if ($form->isValid()) {
            ... code whn valide ...
            if ( $request->isXmlHttpRequest() ) {
                return new JsonResponse('OK');
            }
        }
    }

    return $form;
}
$('#myform').on('submit',function(e){
            var formdata = $('#myform').serialize();
            var href = $(this).attr('action');
            $.ajax({
                type: "POST",
                url: href,
                data: formdata,
                cache: false,
                success: function(data){
                    if(data != "OK") {
                        $('.form_area').html(data);
                    } 
                },
                error: function(){},
                complete: function(){}
            });
            return false;
        });
JS:

<div class="form_area">
     <form id="myform" action.... >
           ...code form ...
     </form>
</div>
use Symfony\Component\HttpFoundation\JsonResponse;

public function myEditAction(){
    .......
    if ( $request->getMethod() == 'POST' ) {
        $form->bind($request);

        if ($form->isValid()) {
            ... code whn valide ...
            if ( $request->isXmlHttpRequest() ) {
                return new JsonResponse('OK');
            }
        }
    }

    return $form;
}
$('#myform').on('submit',function(e){
            var formdata = $('#myform').serialize();
            var href = $(this).attr('action');
            $.ajax({
                type: "POST",
                url: href,
                data: formdata,
                cache: false,
                success: function(data){
                    if(data != "OK") {
                        $('.form_area').html(data);
                    } 
                },
                error: function(){},
                complete: function(){}
            });
            return false;
        });

我认为最干净的解决方案是实现JMSSerializerBundle(),它使用以下类:

然后在您的控制器中

        // ...
        if ($request->isXMLHttpRequest()) {
        $jsonResponse = new JsonResponse();

        $serializer = $this->container->get('jms_serializer');
        $form = $serializer->serialize($form, 'json');

        $data = array('success' => false,
                       'errorList' => $form);

        $jsonResponse->setData($data);

        return $jsonResponse;
    }

您可以在JS中进行验证,但imho taht是进行服务器端验证的更好方法。通过JSON发送数据是一个不错的选择。这种方法有什么问题?不,我不使用JS验证,因为我不想在两个不同的地方定义验证。我现在做服务器端验证,但是我找不到一个合适的方法来获取表单+实体属性和验证器中的所有错误。只需对表单中的元素进行交互,并获取每个元素的错误。这是我不喜欢的解决方案。这很讨厌,不实用。看看我自己如何解决这个问题的答案。非常干净的方法。应该是答案。IMO不是很干净,因为您必须解析响应的
errorList
字段中包含的JSON。这意味着您必须
JSON.parse
一个包含在JSON响应中的字符串…太棒了!您能解释一下为什么需要检查表单是否是根吗?