Symfony2フォームエンティティの更新の具体例を教えてください。この本は、新しいエンティティを作成する方法のみを示しています。クエリ文字列でエンティティのIDを最初に渡す既存のエンティティを更新する方法の例が必要です。
フォームを再作成せずに投稿をチェックするコードで、フォームに再度アクセスする方法を理解するのに苦労しています。
そして、フォームを再作成する場合、エンティティを再度クエリする必要があることを意味しますが、これはあまり意味をなさないようです。
私が現在持っているものはここにありますが、フォームが投稿されるとエンティティを上書きするため機能しません。
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()
));
}
今働いています。いくつかのことを微調整する必要がありました。
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()
));
}
これは実際にはSymfony 2のネイティブ関数です:
コマンドラインから(doctrine:generate:crudを介して)CRUDコントローラーを自動的に生成し、生成されたコードを再利用できます。
ここにドキュメント: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html
Symfonyのコマンドで自動生成されたCRUDコードの概要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(),
));
}
ID(文字列または整数)の代わりにDoctrineエンティティがアクションに渡されることに注意してください。これにより、暗黙的なパラメータ変換が行われ、指定されたIDの対応するエンティティを手動で取得する必要がなくなります。
Symfonyのドキュメントでは ベストプラクティス と記載されています