Php 需要多个数据映射器的域对象

Php 需要多个数据映射器的域对象,php,oop,data-modeling,repository-pattern,Php,Oop,Data Modeling,Repository Pattern,我试图弄清楚如何在应用程序的不同部分重用域模型,我感觉数据映射器模式是前进的方向。下面的示例具有直接访问映射器方法的方法 class Groups { protected $_groups = array(); public function addGroup($name) { $this->_groups[] = $name; } public function doSomethingGroupy($cakes) {

我试图弄清楚如何在应用程序的不同部分重用域模型,我感觉数据映射器模式是前进的方向。下面的示例具有直接访问映射器方法的方法

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;
    {
}
现在我知道目标是瘦控制器-胖模型,那么我会有另一个模型来将映射器(可以这么说)映射到该模型吗

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);
    {
}

数据模型应该不了解数据映射器。您的组类/模型不应具有find方法,也不应具有对映射器的访问权限

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


注意:请查看

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


考虑到这些因素,您应该只需要向映射器添加方法,为此,我将使用继承,即为新功能扩展您的组映射器。当然,这需要映射器可注入到模型中。但是,如果要让模型保留对其映射器的引用,那么无论如何它都需要是可注入的。

如果“组”是包含“组”对象的集合,而这些对象本身就是需要依赖映射的模型,该怎么办。您是否必须将它们从组中分离,通过映射器传递它们,然后将它们重新附着到集合中?这是否意味着客户机/控制器需要映射程序的知识?您的
FatModel
称为存储库。这里有一个很好的解释:你为什么要这么做?设计它以满足您的需要。我不会用回购作为缓存。将缓存放在数据映射器上。啊,好吧,那么我不确定工作单元用于什么?存储库检索对象并将它们传递给调用方,然后存储库就完成了。存储库不跟踪自己检索的内容,也不知道其他存储库可能做了什么,也不知道根本不来自存储库的新对象。要更新数据库,必须有人知道什么是什么?工作单元是一个管理器对象,它跟踪从所有存储库检索到的所有内容,为创建的任何新对象添加了记录,并知道如何在事务中保存所有内容。这是一个持久性会话。在我的第一次尝试中,我确实添加了对映射器的引用,并且很早就意识到了这样做的局限性。然而,我无法想象在没有模型或控制器的情况下如何使用映射器。我不认为直接使用映射器的控制器有任何问题,因为控制器是特定于应用程序/模块的。映射器是否可以了解其他映射器?