我使用一些Angular JS代码将一个文件和一些其他字段(以及一个CSRF令牌)提交给Symfony控制器。
var formObject = new FormData;
formObject.append('email', self.careers[index].application.email);
formObject.append('motivation', self.careers[index].application.motivation);
formObject.append('resume', self.careers[index].application.file);
formObject.append('jobID', self.careers[index].id);
formObject.append('_token', self.CSRF);
$http.post('/app_dev.php/jobs/apply', formObject, {
transformRequest: angular.identity,
headers: { 'Content-Type': undefined }
}).success(function(){
self.careers[index].application = {};
}).error(function(){
// TODO: Explode on error
});
一切都很好,直到信息传递到我的控制器,在那里一切似乎都爆炸了。
public function applyAction(Request $request) {
$jobApplication = new JobApplications();
if (!$jobApplication) {
throw $this->createNotFoundException('Unable to find JobApplications entity.');
}
$form = $this->createFormBuilder($jobApplication)
->add('jobId')
->add('email')
->add('coverLetter')
->add('file')
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$jobApplication->upload();
$em->persist($jobApplication);
$em->flush();
}
$response = 'some success message';
return new JsonResponse($response);
}
对Symfony和JS进行了六个小时的调试,在广阔的互联网上搜索答案,然后在桌子上撞了我的头,我发现:
$request
包含我发布的所有变量。$form->isValid() = FALSE
$form->isSubmitted() = FALSE
如果我改变了
$form->handleRequest($request)
至$form->submit($request)
,$form->isSubmitted() = TRUE
,但$form->isValid() = FALSE
如果我删除验证,Symfony会抛出一个巨大错误,指出$jobApplication
的所有属性都为空。
我对Symfony相当新(约4个月)所以我认为我一定做错了。关于SO的所有其他类似问题并没有解决我的困境。
var_dump($form->getData());
返回所有表单字段元素null
,即使在$form->handleRequest($request)
答案 0 :(得分:2)
方法createFormBuilder创建默认名称为“form”的表单
public function createFormBuilder($data = null, array $options = array())
{
return $this->container->get('form.factory')->createBuilder('form', $data, $options);
}
所以
$form->handleRequest($request)
在
中查找数据表格[电子邮件],表格[jobId]等。
尝试使用
$form->submit($request->request->all())
相反
$form->handleRequest($request)
<强>更新强>
似乎angular.js以JSON格式发布数据。因此,首先需要从请求中获取原始数据,然后在提交之前对其进行解码