我对使用Doctrine ORM的类表继承(CTI)与ZF2的Zend\Form
有疑问。在我们的系统中,每个用户可以拥有多个角色,这些角色通过类表继承方案定义,以便我们可以定义特定于角色的配置文件字段(即:“年级”仅适用于学生帐户)。要构造它,有一个Account
实体与Account\Role
(CTI“基础”类)的OneToMany关联:
<?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
实体的Account
实例(我跟着example from the DoctrineModule
documentation),所有内容似乎都在运行A-OK ...除外CTI系列。在我的Form对象中,我添加了一个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对象时自动填充集合的元素?
答案 0 :(得分:1)
我已经入侵了一个适用于我的用例的解决方案:构建一个自定义NonuniformCollection
表单元素,该元素传递一组原型(每个CTI实体一个)并克隆适当的当元素被填充时。
我已将代码放在Gist中:https://gist.github.com/adamlundrigan/5195646
有一点需要注意,模板功能不再有效,因为它不知道要使用哪种原型。
如果有任何人有任何建议,我仍然愿意以更清洁的方式实现这一目标:)