Doctrine 2协会覆盖

时间:2014-04-13 08:52:13

标签: php dependency-injection doctrine-orm associations

我有一个关于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,我需要重新定义每个类。

0 个答案:

没有答案