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

tes*_*ter 3 forms validation ajax 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;
}
Run Code Online (Sandbox Code Playgroud)

validation.yml:

Namespace\XYBundle\Entity\Contact:
properties:
    name:
        - NotBlank: ~
        - Length:
            min: 2
            max: 20
    email:
        - NotBlank: ~
        - Email: ~
    message:
        - NotBlank: ~
        - Length:
            min: 10
            max: 10000
Run Code Online (Sandbox Code Playgroud)

这里是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");
            }
        });
Run Code Online (Sandbox Code Playgroud)

Kri*_*ris 5

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

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