Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AJAX表单提交(带文件)至Symfony,但$form->;isValid返回false_Ajax_Angularjs_Forms_Symfony - Fatal编程技术网

AJAX表单提交(带文件)至Symfony,但$form->;isValid返回false

AJAX表单提交(带文件)至Symfony,但$form->;isValid返回false,ajax,angularjs,forms,symfony,Ajax,Angularjs,Forms,Symfony,我使用一些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.appe

我使用一些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
    包含我发布的所有变量
  • $form->isValid()=FALSE
  • $form->isSubmitted()=FALSE

  • 如果我从
    $form->handleRequest($request)
    $form->submit($request)
    $form->isSubmitted()=TRUE
    $form->isValid()=FALSE

  • 如果我删除验证,Symfony会抛出一个巨大的错误,指出
    $jobApplication
    的所有属性都为null

我是Symfony的新手(~4个月),所以我想我一定是做错了什么。所有其他类似的问题都没有解决我的困境

更新
var_dump($form->getData())
返回所有我的表单字段元素都是
null
,即使在
$form->handleRequest($request)
方法createFormBuilder使用默认名称“form”创建表单之后也是如此

所以

查找数据

表格[电子邮件]、表格[工号]等

试用

$form->submit($request->request->all())
反而

$form->handleRequest($request)
更新


似乎angular.js以JSON格式发布数据。所以首先需要从请求中获取原始数据,然后在提交之前对其进行解码

这似乎就是$form->handleRequest失败的原因。最后,我不得不快速找到解决方案,因此我开始对表单进行预渲染,并通过正常的帖子提交表单。在Symfony3中使用正常的表单提交(PUT)处理此问题。听起来像个虫子。通过适当的方法到达路线。为什么提交的是假的?
$form->submit($request->request->all())
$form->handleRequest($request)