3

我有一个联系表单,我使用 FormTypes 和它的 validation.yml 呈现。提交的表单通过 POST 和 AJAX 发送到控制器操作。问题是$form->isValid()尽管我在表单中输入了正确的数据,但它总是返回 false。如果我删除了validation.yml,它仍然返回false。那么表单的验证从哪里获取数据呢?为什么总是返回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;
}

验证.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");
            }
        });
4

2 回答 2

5

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

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

于 2013-06-30T12:06:43.090 回答
3

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

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

顺便提一句。另外两个小费。在这种情况下,返回带有 HTTP 状态代码 403 Bad Request 的错误会更好。JQuerys 错误函数应该用一切调用!= 200。

对于记录独白是一件好事。

$this->get('logger')->error('email foo bar');
于 2013-06-30T12:09:21.273 回答