Как я могу опубликовать свой объект через Ajax и сохранить int в базе данных через 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

2 ответа

Решение

Поскольку вы используете jQuery и просто пытаетесь отправить форму для редактирования, я бы изначально предложил использовать плагин malsup ajaxForm. Конечно, вы можете реализовать ту же функциональность с FormData и AJAX-запросом.

В случае, если вы используете плагин ajaxForm, вам просто нужно правильно настроить действие вашей формы (маршрут должен быть примерно таким: / edit-user / 1, где 1 - идентификатор пользователя), а код 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');
}

Функция serializeArray в одиночку для этой цели довольно бесполезно. Для того, чтобы он работал, ваш контроллер должен знать формат передачи данных, и по умолчанию контроллер Symfony вообще не ожидает этот формат.

Лучший подход - сериализовать ваши данные в key:value формат, а не, {name: key, value: value},

Для преобразования данных я не буду повторять ответ, принадлежащий сообществу: преобразовать данные формы в объект JavaScript с помощью 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, поэтому я не вижу причины, по которой он не используется здесь...

Надеюсь это поможет...

Другие вопросы по тегам