Doctrine Hydrator チュートリアルに従っていましたが、フィールドセットに ObjectSelect が含まれていると保存に問題が発生します。エンティティで ORM マッピングを使用しています。基本的に私はとRole
エンティティを持っid
ていname
ます。、および(ManyToOne)を持つUser
エンティティもあります。ゲッターとセッターもあります。私のメソッドはエンティティをパラメーターとして渡します。id
name
role
setRole()
Role
/** @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 を追加する UserForm をセットアップします。
私のコントローラーアクション
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 を変更する必要があるのか、Role エンティティをフォームにバインドする必要があるのか わかりません。これは明らかに単純化された例ですが、実際のフォームには多くの関連付けがあり、このようにコントローラーでコーディングするのは面倒です。
更新: 投稿とフォームに関するデバッグ情報。
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)