例如:

我有具有10只小部件的用户。沿着与我有管理这些窗口小部件的5管理器。

我想检索用户的窗口小部件由指定的经理管理。因此,我创建它询问分贝为那些5只小部件和映射窗口小部件的阵列的对象的功能在我WidgetMapper称为fetchUsersManagedWidgets($用户id,$经理ID)。

我知道域对象不应该是知道自己的地图制作的,但我可以在用户模型,调用WidgetMapper的函数创建一个函数?

e.g。

class Application_Model_User {

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

}

或者是这一个单行道,和域对象应该调用映射功能?

有帮助吗?

解决方案

一般

模式是你如何能解决的共同问题的想法。他们既不是“不得不这样做的”或“一切是坏”。事实上,甚至还有没有下面的模式故意名称的decission。结果 从我所看到的人倾向于认为“一个数据库表是一个域所以每一个DB-表需要一个模型和一个映射器”。在你的情况我想你有三个表:用户,widgets和表保持N:m之间的关系这两个(我称之为userwidgets)点击 该userwidgets是真正的用户模型的一部分,并没有自己的模型/映射,是的不可以窗口小部件模型的一部分。要解决在这些的usermodel部件编号可能需要过程的部件映射器导致的问题,您描述了。结果 可能有很多的方法来解决这个问题,我简单地假设一个默认映射器是重写的:

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

如果你不想让访问用户的小部件(他们应该按需加载)之前,使用的默认控件映射器,你应该简单地把它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top