AJAX 表单提交(带有文件)到 Symfony 但 $form->isValid returns false
AJAX form submit (with a file) to Symfony but $form->isValid returns false
我使用一些 Angular JS 代码向 Symfony 控制器提交一个文件和一些其他字段(和一个 CSRF 令牌)。
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
包含我post. 的所有变量
$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());
returns 我所有的表单字段元素都是 null
,即使在 $form->handleRequest($request)
之后
方法 createFormBuilder 使用默认名称创建表单 "form"
public function createFormBuilder($data = null, array $options = array())
{
return $this->container->get('form.factory')->createBuilder('form', $data, $options);
}
所以
$form->handleRequest($request)
正在查看
中的数据
form[email], form[jobId], etc..
尝试使用
$form->submit($request->request->all())
相反
$form->handleRequest($request)
更新
似乎 angular.js post 数据采用 JSON 格式。所以首先需要从请求中获取原始数据,然后在提交之前对其进行解码
我使用一些 Angular JS 代码向 Symfony 控制器提交一个文件和一些其他字段(和一个 CSRF 令牌)。
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
包含我post. 的所有变量
$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());
returns 我所有的表单字段元素都是 null
,即使在 $form->handleRequest($request)
方法 createFormBuilder 使用默认名称创建表单 "form"
public function createFormBuilder($data = null, array $options = array())
{
return $this->container->get('form.factory')->createBuilder('form', $data, $options);
}
所以
$form->handleRequest($request)
正在查看
中的数据form[email], form[jobId], etc..
尝试使用
$form->submit($request->request->all())
相反
$form->handleRequest($request)
更新
似乎 angular.js post 数据采用 JSON 格式。所以首先需要从请求中获取原始数据,然后在提交之前对其进行解码