域对象可以调用其他数据映射器吗? (Zend框架)

例如:

我有一个拥有10个Widget的用户。 除此之外,我还有一位经理负责管理其中的5个小部件。

我想检索由指定管理器管理的用户Widgets。 所以我在我的WidgetMapper中创建了一个名为fetchUsersManagedWidgets($ userId,$ managerId)的函数,它为这5个小部件查询数据库并映射Widget对象数组。

我知道域对象不应该知道他们的映射器,但我可以在用户模型中创建一个调用WidgetMapper函数的函数?

例如

class Application_Model_User {

    public function getWidgetsManagedBy($manager) {
        $widgetMapper = new Application_Model_WidgetMapper;
        return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId());
    }

}

或者这是单向街道,域对象不应该调用映射函数?


一般来说,模式就是你如何解决一个共同问题的想法。 他们既不是“必须这样做”,也不是“其他一切都不好”。 事实上,甚至有一个名称不符合故意模式。
根据我所看到的,人们倾向于认为“一个db表是一个域,所以每个db表需要一个模型和一个映射器”。 在你的情况下,我想你有三个表:用户,小工具和持有这两者之间的n:m关系的表(我将它称为userwidgets)。
userwidgets实际上是用户模型的一部分,没有自己的模型/映射器, 也不是widget模型的一部分。 要解决用户模型中的这些小部件ID,确实需要小部件映射器,这会导致您描述的问题。
有很多方法可以解决这个问题,我简单地假设一个可覆写的default-mapper:

Class UserModel
{
    $_widgetMapper = null;

    public function getWidgetMapper()
    {
        if(null === $this->_widgetMapper)
        {
             $this->setWidgetMapper(new DefaultWidgetMapper());
        }
        return $this->_widgetMapper();
    }

    public function setWidgetMapper($mapper)
    {
        // todo: make sure it's a mapper of the correct type
        $this->_widgetMapper = $mapper;
    }
}

如果你不想使用默认的widget-mapper,你应该在访问用户的小部件之前进行设置(它们应该按需加载)。

链接地址: http://www.djcxy.com/p/56227.html

上一篇: Can domain objects call other data mappers? (Zend Framework)

下一篇: Is this the common structure for the domain mapper model?