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 调试,在广阔的互联网上搜索答案,然后用头撞桌子,后来我发现:

我是 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 格式。所以首先需要从请求中获取原始数据,然后在提交之前对其进行解码