我有一个关于Doctrine 2的问题以及扩展类之间关联的能力(或不是?)。
最好用一个例子来解释:)
假设我有这个模型(代码不完整):
/**
* @Entity
*/
class User {
/**
* @ManyToMany(targetEntity="Group")
* @var Group[]
*/
protected $groups;
}
/**
* @Entity
*/
class Group {
/**
* @ManyToMany(targetEntity="Role")
* @var Role[]
*/
protected $roles;
}
/**
* @Entity
*/
class Role {
/**
* @ManyToOne(targetEntity="RoleType")
* @var RoleType
*/
protected $type;
}
/**
* @Entity
*/
class RoleType {
public function setCustomDatas(array $params) {
// do some stuff. Default to nothing
}
}
现在我在一些项目中使用这个模型。突然之间,在一个新项目中,我需要将RoleType略有不同,以及DB和其他方法中的其他一些字段。当然,这完全出乎意料。
我在“view-controller-but-not-model”代码中所做的是使用服务:
// basic configuration
$services['RoleType'] = function() {
return new RoleType();
};
// and then in the script that create a role
$role_type = $services['RoleType'];
$role_type->setCustomDatas($some_params);
在应用程序初始化期间,我只需添加此行以覆盖默认的RoleType
$services['RoleType'] = function() {
return new GreatRoleType();
};
好的,太棒了!我可以自定义RoleType调用,然后加载一些自定义类的自定义类。
但是......现在我有我的模特。该模型表明角色的目标是RoleType。这很难写。现在,要使我的自定义更改正常工作,我需要以这种方式扩展Role类:
/**
* @Entity
*/
class GreatRole extends Role {
/**
* Changing the targetEntity to load my custom type for the role
* @ManyToOne(targetEntity="GreatRoleType")
* @var RoleType
*/
protected $type;
}
但是,我需要将Group类扩展为目标GreatRole而不是Role。 最后,我需要将User扩展到目标GreatGroup(目标GreatRole,目标是GreatRoleType)。
有没有办法避免这种级联延伸?或者,那里有一种与我所做的完全不同的最佳实践吗?
我需要使用MappedSuperClasses吗?该文档不是很明确......
感谢您的帮助!
---------------------------编辑------------------- --------
如果我尝试从User获取所有层次结构,那就是遇到问题时:
$query
->from('User', 'u')
->leftJoin('u.groups', 'g')
->leftJoin('g.roles', 'r')
->leftJoin('r.type', 't');
如果我想要一个“r.type”= GreatRoleType,我需要重新定义每个类。