2013-07-18 38 views
0

我有一個簡單的類:使用symfony2 + doctrine +表單更新db中類對象的正確方法?

class Type 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string", length=15) 
    */ 
    private $name; 

    ... 
} 

而且在數據庫中的某些「類型」的對象。 所以,如果我想改變其中的一個,我創建了新的控制器規則(如/類型/編輯/ {ID})和新動作:

public function typesEditViewAction($id) 
{ 
    ... 
    $editedType = new Type(); 

    $form = $this->createFormBuilder($editedType) 
     ->add('name', 'text') 
     ->add('id', 'hidden', array('data' => $id)) 
     ->getForm(); 

    // send form to twig template 
    ... 
} 

在那之後,我創建另一個控制器規則(如/類型/ do_edit)和動作:

public function typesEditAction(Request $request) 
{ 
    ... 
    $editedType = new Type(); 

    $form = $this->createFormBuilder($editedType) 
     ->add('name', 'text') 
     ->add('id', 'hidden') 
     ->getForm(); 

    $form->bind($request); // <--- ERROR THERE !!! 

    // change 'type' object in db 
    ... 
} 

我發現了一個小問題。 Сlass'Type'沒有自動生成的setter setId()和綁定我有錯誤。

Neither the property "id" nor one of the methods "setId()", "__set()" or "__call()" exist and have public access in class "Lan\CsmBundle\Entity\Type". 

現在,我從symfony2表單對象($ form)中刪除'id'字段並將其手動傳輸到模板。 在第二個控制器的操作中,我有$ form對象和'id'字段。 我不知道這樣做的「正確」方式(更新'類型'類)。請幫忙。

回答

2

Symfony具有集成的ParamConverter,它會自動從數據庫中提取您的實體,並在實體未找到時拋出異常(您可以捕捉到偵聽器中)。

您可以在一個控制器方法中輕鬆處理GET和POST請求。

確保您的實體擁有您的物業的公共getter和setter。

我添加了註釋以使路由更清晰,並且仍然有一個工作示例。

use Vendor\YourBundle\Entity\Type; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 

// ... 

/** 
* @Route("/edit/{id}", requirements={"id" = "\d+"}) 
* @Method({"GET", "POST"}) 
*/ 
public function editAction(Request $request, Type $type) 
{ 

    $form = $this->createFormBuilder($type) 
     ->add('name', 'text') 
     ->add('id', 'hidden') 
     ->getForm() 
    ; 

    if ($request->isMethod('POST')) { 
     $form->bind($request); 

     if ($form->isValid()) 
     { 
       $em = $this->getDoctrine()->getEntityManager(); 
       $em->flush();   // entity is already persisted and managed by doctrine. 

       // return success response 
     } 
    } 

    // return the form (will include the errors if validation failed) 
} 

我強烈建議你應該創建一個form type來進一步簡化你的控制器。

+0

謝謝你對我今天所有問題的支持:) – TroyashkA

+0

p.s.一會兒。所以我必須爲id創建一個setter?我不知道爲什麼symfony不能自動生成ID字段的設置器 – TroyashkA

+0

http://stackoverflow.com/questions/17089307/how-do-i-configure-a-doctrine2-entity-which-extends-persistentobject- within-symf ...如果你不想爲你的實體創建getter和setter,但是我不推薦它,請參閱我的關於如何使用Doctrine的PersistentObject的回答。通過IDE集成(Eclipse PDT Extras,Sublime via Plugin,PHPStorm都有自動生成方法)或'doctrine:generate:entities'命令,生成一些getters/setters真的只需幾秒鐘。 – nifr

1

爲別人絆倒在此,你添加了ID字段到您的FormType因爲前端需要它,你可以只設置ID列「未映射」,例如:

->add('my_field', 'hidden', ['mapped'=>false]) 

,並阻礙了試圖使用表單處理方法使用的ID值。

相關問題