我有一个联系表单,我使用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");
}
});
答案 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');