如何通过 Ajax post 我的对象并通过实体管理器将 int 存储到数据库中?

How can I post my Object via Ajax and store int into the database via Entity Manager?

$('#form_save').on( 'click', function (e) {
      e.preventDefault();
      var form = $(this).closest('form');
      var formData = form.serializeArray();

      alert(formData.toSource());
      $.ajax({
        method:'POST',
        url:'{{ path('edit_form', { 'slug': page.slug }) }}',
        data: formData,
        success: function(data){

          alert("success");
        }
      });
    });

var formData 给我以下警报输出:

[{name:"form[username]", value:"1"}, {name:"form[email]", value:"1@12.sw"}, {name:"form[is_active]", value:"1"}, {name:"form[plainPassword][first]", value:""}, {name:"form[plainPassword][second]", value:""}, {name:"form[_token]", value:"MdSCmPgzZC3pZaW2wK2Rk"}]

我现在如何在我的控制器中使用它来将它存储到数据库中:

public function form($slug, Request $request){

    $id = $request->request->get('id');

    $item = new User();
    $item= $this->getDoctrine()->getRepository(User::class)->find($id);

    if($request->request->get('data')){

         $data = $request->request->get('data');
         $entityManager = $this->getDoctrine()->getManager();
         $entityManager->flush();
       }
    }

我收到错误消息:

The identifier id is missing for a query of App\Entity\User

函数 serializeArray 单独用于此目的是非常无用的。为了让它工作,你的控制器应该知道你传输数据的格式,默认情况下,Symfony 的控制器根本不需要这种格式。

最好的方法是以 key:value 格式而不是 {name: key, value: value} 格式序列化您的数据。

关于转换数据,我不会重复社区拥有的答案:Convert form data to JavaScript object with jQuery

我想,一旦您获得了 key:value 格式的数据,您就可以更改您的控制器。例如:

$data = json_decode($request->getContent(), true);

var_dump($data['form[email]']);

上面应该输出1@12.sw。这有点笨拙,但应该可以。在我看来,你真的应该使用 Symfony Form 组件,submit() 数据到它并且非常平常地使用它。 form[_token] 字段表明此表单的 HTML 实际上是由 Symfony 表单组件生成的,因此我也看不出在这里不使用它的原因...

希望这对您有所帮助...

由于您正在使用 jQuery,并且您只是想提交一个编辑用户表单,所以我最初建议使用 malsup's ajaxForm plugin。当然,您可以使用 FormData 和 ajax 请求实现相同的功能。

如果您使用 ajaxForm 插件,您只需正确设置表单的操作(路由应该是这样的:/edit-user/1 其中 1 是用户 ID),javascript 代码将如下所示:

$('form#your-form').ajaxForm({
    success: function(response){ alert("success"); }
});

Symfony 控制器将如下所示:

public function form(User $user, Request $request){
    $form = $this->createForm(UserType::class, $user);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->flush();
    }

    return $this->json('success');
}