web-dev-qa-db-fra.com

Mise à jour de l'entité de formulaire Symfony2

Quelqu'un peut-il me montrer un exemple spécifique de mise à jour d'une entité de formulaire Symfony2? Le livre montre seulement comment créer une nouvelle entité. J'ai besoin d'un exemple de mise à jour d'une entité existante où je passe initialement l'ID de l'entité sur la chaîne de requête.

J'ai du mal à comprendre comment accéder à nouveau au formulaire dans le code qui vérifie la publication sans recréer le formulaire.

Et si je recrée le formulaire, cela signifie que je dois également interroger à nouveau l'entité, ce qui ne semble pas très logique.

Voici ce que j'ai actuellement mais cela ne fonctionne pas car il écrase l'entité lorsque le formulaire est publié.

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()
    ));
}
23
Jeremy Hicks

Travaille maintenant. J'ai dû modifier quelques choses:

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()
    ));
}
16
Jeremy Hicks

Il s'agit en fait d'une fonction native de Symfony 2:

Vous pouvez générer automatiquement un contrôleur CRUD à partir de la ligne de commande (via doctrine: generate: crud) et réutiliser le code généré.

Documentation ici: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html

10
adurieux

Un aperçu rapide du code CRUD généré automatiquement par la commande Symfony's generate:doctrine:crudaffiche le code source suivant pour l'action d'édition

/**
     * 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(),
        ));
    }

Notez qu'une entité Doctrine est transmise à l'action au lieu d'un identifiant (chaîne ou entier). Cela entraînera une conversion de paramètre implicite et vous évitera de récupérer manuellement l'entité correspondante avec l'identifiant donné.

Il est mentionné comme meilleure pratique dans la documentation de Symfony

1
medunes