Задать вопрос
Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!

Объясните пожалуйста, как работает обновление записи в БД Symfony/Doctrine?

Изучаю Symfony-3. Сгенерировал сущности, создал формы, сгенерировал CRUD... Для примеры была взята таблица vendor, состоящая из 3-х простых полей: id, title, email.

Стандартный код из CRUD-генератора, который мне не до конца ясен:
/**
     * Displays a form to edit an existing vendor entity.
     *
     * @Route("/{id}/edit", name="vendor_edit")
     * @Method({"GET", "POST"})
     */
    public function editAction(Request $request, Vendor $vendor)
    {
        $deleteForm = $this->createDeleteForm($vendor);
        $editForm = $this->createForm('AppBundle\Form\VendorType', $vendor);
        $editForm->handleRequest($request);

        if ($editForm->isSubmitted() && $editForm->isValid()) {
            $this->getDoctrine()->getManager()->flush();

            return $this->redirectToRoute('vendor_edit', array('id' => $vendor->getId()));
        }

        return $this->render('vendor/edit.html.twig', array(
            'vendor' => $vendor,
            'edit_form' => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }


мне не совсем понятны два момента:
public function editAction(Request $request, Vendor $vendor)

Здесь помимо запроса, мы так же передаём объект Vendor. Не совсем понимаю эту логику. Если бы у нас передавалось две формы сразу, например Vendor и User, появился бы так же объект User и он бы автоматически присвоился переменной $user? Обычно, нужные данные я вытаскивал непосредственно из переменной $request и присваивал их "руками", куда мне нужно (хотя, такой вариант мне тоже безусловно нравится).

Второй не ясный для меня момент:
if ($editForm->isSubmitted() && $editForm->isValid()) {
            $this->getDoctrine()->getManager()->flush();


Здесь в первой строке идёт проверка на то, что форма заполнена, а дальше происходит какая-то магия не ясная мне. У нас нет никаких переменных, но делаем сброс буфера. Откуда Doctrine знает, что именно и куда нужно записать? Я не нашел нигде в коде контроллера какого либо звена связующего вторую строку кода с каким либо объектом.

Поясните пожалуйста, как всё это работает или если не сложно - ткните в документацию, где бы можно было про это прочитать. Спасибо!
  • Вопрос задан
  • 1047 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Если бы у нас передавалось две формы сразу, например Vendor и User, появился бы так же объект User и он бы автоматически присвоился переменной $user? Обычно, нужные данные я вытаскивал непосредственно из переменной $request и присваивал их "руками", куда мне нужно (хотя, такой вариант мне тоже безусловно нравится).

ParamConverter ориентируется на тайпхинтинг в параметрах экшена и автоматически вытягивает вам нужную сущность из БД согласно параметрам маршрута.
Здесь в первой строке идёт проверка на то, что форма заполнена, а дальше происходит какая-то магия не ясная мне. У нас нет никаких переменных, но делаем сброс буфера. Откуда Doctrine знает, что именно и куда нужно записать?

Никакой магии. Изучайте как работает ORM типа Data Mapper. У вас есть Entity Manager, который "перзистит" (persist) определённые сущности. В данном случае у вас в него сущность попадает при обработке формы прозрачно (как бы за кадром) через так называемые DataTransformers.
делаем сброс буфера

В общем, посмотрите, что такое Flush относительно этой ORM. Например, тут.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы