2

Doctrine Hydrator チュートリアルに従っていましたが、フィールドセットに ObjectSelect が含まれていると保存に問題が発生します。エンティティで ORM マッピングを使用しています。基本的に私はとRoleエンティティを持っidていnameます。、および(ManyToOne)を持つUserエンティティもあります。ゲッターとセッターもあります。私のメソッドはエンティティをパラメーターとして渡します。idnamerolesetRole()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)
4

1 に答える 1

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();
}
于 2013-11-14T18:57:49.870 に答える