AJAX表单提交(带有文件)到Symfony但是$ form-> isValid返回false

时间:2015-03-12 16:04:24

标签: ajax angularjs forms symfony

我使用一些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)

之后

1 个答案:

答案 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格式发布数据。因此,首先需要从请求中获取原始数据,然后在提交之前对其进行解码