Symfony $ form-> isValid()在ajax调用时返回false

时间:2013-06-30 11:55:58

标签: ajax forms validation symfony

我有一个联系表单,我使用FormTypes和validation.yml进行渲染。提交的表单通过POST和AJAX发送到控制器操作。问题是$form->isValid()总是返回false,尽管我在表单中输入了正确的数据。如果我删除validation.yml它仍然返回false。那么表单的验证从何处获取数据?为什么它总是返回假?

这是动作控制器:

public function contactAction()
{
    $true = new Response(json_encode(true), 200);
    $false = new Response(json_encode(false), 500);

    $form = $this->createForm(new ContactType(), new Contact());
    $request = $this->getRequest();

    if($request->isMethod('POST') && $request->isXmlHttpRequest()){
        $form->bind($request);

        if($form->isValid()){
            // email here
            error_log('email worked');
            return $true;
        }
    }
    error_log('email not worked');
    return $false;
}

validation.yml:

Namespace\XYBundle\Entity\Contact:
properties:
    name:
        - NotBlank: ~
        - Length:
            min: 2
            max: 20
    email:
        - NotBlank: ~
        - Email: ~
    message:
        - NotBlank: ~
        - Length:
            min: 10
            max: 10000

这里是ajax调用的jQuery / JS代码:

$.ajax({
            type: "post",
            url: "contact",
            data: "name=" + name + "&email=" + email + "&message=" + message,
            error: function() {
                $('.error').remove();
                $('#sendError').slideDown('slow');
                $('button').removeAttr("disabled");
                $('button').css("color", "#333333");
            },
            success: function () {
                $('.error').remove();
                $('#success').slideDown('slow');
                $("input[name='contact[name]']").val('');
                $("input[name='contact[email]']").val('');
                $("textarea[name='contact[message]']").val('');
                $('button').removeAttr("disabled");
                $('button').css("color", "#333333");
            }
        });

2 个答案:

答案 0 :(得分:5)

由于您手动传入数据,因此忘记传入CSRF令牌字段(_token),导致它始终无效。

我建议你做 data: $('#myForm').serialize()以确保发送所有字段

答案 1 :(得分:3)

不要在自己身上构建表单数据。主要CRSF令牌丢失。 JQuery有一个很好的表单序列化器。

    $.ajax({
        type: "post",
        url: "contact",
        data: $('#yourFormId').serialize(),
        // ...
    });

顺便说一下。另外两个tipps。使用HTTP状态代码403错误请求返回错误在此方案中更适合。应该用所有东西调用JQuerys错误函数!= 200。

对于记录monolog是一件好事。

$this->get('logger')->error('email foo bar');