我一直在關注Doctrine Hydrator tutorial,但是當我的fieldset包含ObjectSelect時,我遇到了問題。我在我的實體上使用ORM映射。基本上我有一個Role
實體與id
和name
。我還有一個User
實體,其中id
,name
和role
(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)
你能檢查是否'$形式 - >的getData()'返回正確的對象?或者如果它只是ID,也是如此。只有ID實際上應該從你的'setRole()'方法返回一個錯誤(因爲它應該期望一個對象而不是一個ID) – Sam
我已經添加了調試信息。發佈數據包含角色的ID,但是當設置爲表單時,顯然由於該角色不是角色對象,所以沒有設置該角色。 – livearoha