如何通过Ajax发布对象并通过Entity Manager将int存储到数据库中?

时间:2018-08-13 20:44:51

标签: ajax symfony post entitymanager

$('#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

2 个答案:

答案 0 :(得分:2)

由于您使用的是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');
}

答案 1 :(得分:0)

仅用于此目的的功能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 Form组件生成的,因此我在这里也看不到不使用它的原因...

希望这对您有帮助...