2013-10-09 16 views
2

我一直在關注Doctrine Hydrator tutorial,但是當我的fieldset包含ObjectSelect時,我遇到了問題。我在我的實體上使用ORM映射。基本上我有一個Role實體與idname。我還有一個User實體,其中id,namerole(ManyToOne)。我也有我的getter和setter。我的setRole()方法將Role實體作爲參數傳遞。保存包含使用Zend表單的ObjectSelect元素的Doctine 2實體

/** @param Role $role */ 
public function setRole(\Application\Entity\Role $role) { 
    $this->role = $role; 
} 

我用Doctrine Hydrator設置UserFieldset。

$this->setHydrator(new DoctrineHydrator($objectManager, 'Application\Entity\User')) 
    ->setObject(new User()); 

的對象選擇角色

$this->add(array(
    'type' => 'DoctrineModule\Form\Element\ObjectSelect', 
    'name' => 'role', 
    'options' => array(
     'label' => 'Role', 
     'object_manager' => $objectManager, 
     'target_class' => 'Application\Entity\Role', 
     'property' => 'name' 
    ) 
)); 

我然後設置用於設置DoctrineHydrator並添加UserFieldset用戶窗體。

我的控制器動作

public function addUserAction() { 
    $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); 
    $form = new UserForm($objectManager); 
    $user = new User(); 
    $form->bind($user); 
    if ($this->request->isPost()) { 
     $form->setData($this->request->getPost()); 
     if ($form->isValid()) { 
      $objectManager->persist($user); 
      $objectManager->flush(); 
     } 
    } 
    return array('form' => $form); 
} 

什麼似乎是發生的是,角色的ID被傳遞到角色setRole而不是一個對象。作爲一種變通方法,我修改了我的行動:

if ($form->isValid()) { 
    $objectManager->persist($user); 
    $data = $this->request->getPost(); 
    $role = $objectManager->find('Application\Entity\Role', $data->user['role']); 
    $user->setRole($role); 
    $objectManager->flush(); 
} 

看來,如果這個額外步驟不應要求,但我不知道我是否需要修改我的角色setRole或者,如果我還需要綁定一個角色實體到表單。這顯然是一個簡化的例子,但是我的實際表單有許多關聯,因此必須在控制器中這樣編寫代碼。

更新: 關於帖子和表單的調試信息。

var_dump($form->getData()); 
var_dump($this->request->getPost()); 

輸出

object(Application\Entity\User)[395] 
    protected 'id' => int 6 
    protected 'name' => string 'Jane Doe' (length=8) 
    protected 'role' => null 

object(Zend\Stdlib\Parameters)[146] 
    public 'user' => 
     array (size=3) 
     'id' => string '' (length=0) 
     'name' => string 'Jane Doe' (length=8) 
     'role' => string '3' (length=1) 
    public 'submit' => string 'Add User' (length=8) 
+0

你能檢查是否'$形式 - >的getData()'返回正確的對象?或者如果它只是ID,也是如此。只有ID實際上應該從你的'setRole()'方法返回一個錯誤(因爲它應該期望一個對象而不是一個ID) – Sam

+0

我已經添加了調試信息。發佈數據包含角色的ID,但是當設置爲表單時,顯然由於該角色不是角色對象,所以沒有設置該角色。 – livearoha

回答

3

終於我得到它的工作。問題是我需要添加角色到我的輸入過濾器上的字段集

public function getInputFilterSpecification() { 
    return array(
     'name' => array('required' => true), 
     'role' => array('required' => true) 
    ) 
} 

...和我的表單上的驗證組。

$this->setValidationGroup(array(
    'User' => array(
     'name', 
     'role' 
    ) 
)); 

現在保存在我操作的用戶簡直是

if ($form->isValid()) { 
    $objectManager->persist($user); 
    $objectManager->flush(); 
} 
相關問題