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()
));
}
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()
));
}
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
Un aperçu rapide du code CRUD généré automatiquement par la commande Symfony's generate:doctrine:crud
affiche 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