Doctrine ORMのクラステーブル継承(CTI)をZF2で使用することについて質問がありZend\Form
ます。私たちのシステムでは、各ユーザーが複数の役割を持つことができ、これらの役割はクラステーブル継承スキームによって定義されるため、役割固有のプロファイルフィールドを定義できます(つまり、「グレードレベル」は学生アカウントにのみ適用されます)。これを構築するために、(CTI「基本」クラス)Account
へのOneToManyアソシエーションを持つエンティティがあります。Account\Role
<?php
namespace CdliPortal\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="account")
*/
class Account implements AccountInterface
{
// Other Fields Omitted
/**
* @ORM\OneToMany(targetEntity="CdliPortal\Entity\Account\Role", mappedBy="account", cascade={"ALL"})
*/
protected $roles;
}
エンティティZend\Form
をバインドするインスタンスをすでに設定しました(ドキュメントの例に従いました)。CTIコレクションを除いて、すべてが正常に機能しているように見えます。Formオブジェクトにメンバーを追加します。Account
DoctrineModule
Zend\Form\Element\Collection
$roles = $user->getRoles();
if ( count($roles) > 0 ) {
$formAccount->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'roles',
'options' => array(
'count' => count($roles),
'target_element' => $this->serviceLocator->get('cdliportal_form_account_role'),
),
));
}
roles
ただし、上記のように、フィールド(この場合はフィールドセット)を設定するときtarget_element
は、コレクションレベルで指定されます。つまり、コレクションは均一である必要があります。上記のケースtarget_element
では、コレクションが表すCTIのメンバーに応じて、コレクションの要素ごとに個別に指定できる必要があります。
Accountオブジェクトをバインドするときに、コレクションの要素が自動的に入力されるようにする方法でこれを実現する方法に関するアイデア/アドバイスはありますか?