需要多个Data Mapper的域对象

时间:2010-11-19 19:03:12

标签: php oop data-modeling repository-pattern

我正在试图弄清楚如何在应用程序的不同部分重用Domain Models,我觉得Data Mapper模式是前进的方向。下面的示例包含直接访问Mapper方法的方法。

class Groups
{
    protected $_groups = array();

    public function addGroup($name)
    {
        $this->_groups[] = $name;
    }

    public function doSomethingGroupy($cakes)
    {
        // get all the groups that have cake
        return $cakeyGroups;
    }
}

...和一个映射器匹配Groups类的方法。

class GroupMapper
{
    public function find($id, Groups $group)
    {
         // Mappy type things, maybe some sql
    }

    public function fetchByNeediness($cuddles, Groups $group)
    {
         // More mappy type things
    }

    public function save(Groups $groups)
    {
         //  Saves
    }
}

但是如果以后某个时候我想使用相同的组模型但是使用不同的查询填充组,我会使用不同的映射器。

class AngryGroupMapper
{
    public function find($id, Groups $group)
    {
        // Something similar but with other tables and joins
    }

    public function fetchByRage($anger, Groups $group)
    {
        // Something new but only needed here
    }

    public function isEditable(Groups $groups)
    {
         // Do some querying
         return $bool;
    {
}

现在我知道目标是Skinny Controller - Fat Model,那么我还有另一个模型来映射Mapper(可以这么说)吗?

class FatModelRepository
{
    public function getHappyGroups()
    {
        $mapper = new GroupMapper();
        return $mapper->fetchByNeediness('Puffy Shoes', new Groups());
    }

    public function getSadGroups()
    {
        $mapper = new AngryGroupMapper();
        return $mapper->fetchByRage('Aghh!', new Groups());
    {

    public function save(Groups $groups)
    {
        $mapper = new GroupMapper();
        return $mapper->save($groups);
    {
}

2 个答案:

答案 0 :(得分:4)

数据模型应该不了解Data Mapper。您的Groups类/模型不应该有查找方法,也不应该有对mapper的访问权。

从模型中删除映射器依赖项后,问题就会消失。

注意:请查看Doctrine 2

答案 1 :(得分:0)

正如rojoca所说,你不应该直接在模型上使用fetch / find方法。从技术上来说,他对于不存储对映射器的引用的模型也是正确的,但在不太复杂的情况下,我认为这是可以的,只要模型只能激发你计划拥有的最抽象形式的映射器(即某种基本映射器)。类或接口)。

考虑到事情,你应该只需要向mapper添加方法,为此我只使用继承,即。扩展您的组映射器以获得新功能。当然,这要求映射器可注入模型中。但是如果你想让模型持有对它的映射器的引用,那么无论如何它都需要注入。