Обновление сущности формы Symfony2 - PullRequest
23 голосов
/ 08 июля 2011

Может кто-нибудь показать мне конкретный пример обновления сущности формы Symfony2? Книга только показывает, как создать новую сущность. Мне нужен пример того, как обновить существующую сущность, где я изначально передаю идентификатор сущности в строке запроса.

У меня проблемы с пониманием того, как снова получить доступ к форме в коде, который проверяет сообщение, не создавая заново форму.

И если я воссоздаю форму, это означает, что мне придется снова запросить объект, что, кажется, не имеет особого смысла.

Вот то, что у меня сейчас есть, но оно не работает, потому что перезаписывает сущность, когда форма публикуется.

public function updateAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();
    $testimonial = $em->getRepository('MyBundle:Testimonial')->find($id);
    $form = $this->createForm(new TestimonialType(), $testimonial);

    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);

        echo $testimonial->getName();

        if ($form->isValid()) {
            // perform some action, such as save the object to the database
            //$testimonial = $form->getData();
            echo 'testimonial: ';
            echo var_dump($testimonial);
            $em->persist($testimonial);
            $em->flush();

            return $this->redirect($this->generateUrl('MyBundle_list_testimonials'));
        }
    }

    return $this->render('MyBundle:Testimonial:update.html.twig', array(
        'form' => $form->createView()
    ));
}

Ответы [ 3 ]

16 голосов
/ 01 августа 2011

Работаю сейчас. Пришлось подправить несколько вещей:

public function updateAction($id)
{
    $request = $this->get('request');

    if (is_null($id)) {
        $postData = $request->get('testimonial');
        $id = $postData['id'];
    }

    $em = $this->getDoctrine()->getEntityManager();
    $testimonial = $em->getRepository('MyBundle:Testimonial')->find($id);
    $form = $this->createForm(new TestimonialType(), $testimonial);

    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);

        if ($form->isValid()) {
            // perform some action, such as save the object to the database
            $em->flush();

            return $this->redirect($this->generateUrl('MyBundle_list_testimonials'));
        }
    }

    return $this->render('MyBundle:Testimonial:update.html.twig', array(
        'form' => $form->createView()
    ));
}
10 голосов
/ 22 августа 2011

Это фактически нативная функция Symfony 2:

Вы можете автоматически генерировать контроллер CRUD из командной строки (через doctrine: generate: crud) и повторно использовать сгенерированный код.

Документация здесь: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html

1 голос
/ 13 мая 2017

Быстрый просмотр автоматически сгенерированного кода CRUD по команде Symfony generate:doctrine:crud показывает следующий исходный код для действия редактирования

/**
     * Displays a form to edit an existing product entity.
     *
     * @Route("/{id}/edit", name="product_edit")
     * @Method({"GET", "POST"})
     */
    public function editAction(Request $request, Product $product)
    {
        $editForm = $this->createForm('AppBundle\Form\ProductType', $product);
        $editForm->handleRequest($request);
        if ($editForm->isSubmitted() && $editForm->isValid()) {
            $this->getDoctrine()->getManager()->flush();
            return $this->redirectToRoute('product_edit', array('id' => $product->getId()));
        }
        return $this->render('product/edit.html.twig', array(
            'product' => $product,
            'edit_form' => $editForm->createView(),
        ));
    }

Обратите внимание, что сущность Doctrine передается действию вместоидентификатор (строка или целое число).Это сделает неявное преобразование параметров и избавит вас от ручной выборки соответствующего объекта с заданным идентификатором.

Это упоминается как рекомендация в документации Symfony

...