如何通过 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');
}
$('#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');
}