【问题标题】:Can domain objects call other data mappers? (Zend Framework)域对象可以调用其他数据映射器吗? (Zend 框架)
【发布时间】:2011-05-12 18:21:09
【问题描述】:

例如:

我有一个有 10 个小部件的用户。除此之外,我还有一个管理器来管理其中的 5 个小部件。

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

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

例如

class Application_Model_User {

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

}

或者这是一条单行道,域对象永远不应该调用映射器函数?

【问题讨论】:

    标签: zend-framework datamapper domain-model


    【解决方案1】:

    一般来说,模式是关于如何解决常见问题的想法。他们既不是“必须那样做”或“其他一切都不好”。事实上,甚至有 a name 表示没有故意遵循模式的决定。
    据我所见,人们倾向于认为“一个 db-table 是一个域,因此每个 db-table 都需要一个模型和一个映射器”。在您的情况下,我假设您有三个表:用户、小部件和保存这两者之间的 n:m 关系的表(我将其称为 userwidgets)。
    用户小部件实际上是用户模型的一部分,没有自己的模型/映射器,并且不是小部件模型的一部分。要解决用户模型中的这些小部件 ID,当然需要小部件映射器,这会导致您描述的问题。
    可能有很多方法可以解决这个问题,我只是假设一个可覆盖的默认映射器:

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

    如果您不想使用默认的小部件映射器,您只需在访问用户的小部件之前设置它(它们应该按需加载)。

    【讨论】:

    • 你说得对,我确实有一个具有 n:m 关系的 UserWidgets 表。这让我想到了一个后续问题。如果 userwidgets 没有自己的模型/映射器,我应该使用哪个映射器来保存与数据库的关系?我很想说 UserMapper 中的一个名为 saveUserWidgets($user, $widgets) 的函数是否正确?
    • @craig:是的,我首先将它添加到 UserMapper 中。从 widgetMapper pov 我将成为一个函数 addUser($widget, $user)。两者都可以做到,两者都是正确的,两者都可能有用。我会坚持使用 saveUserWidgets (或者可能使它们变得更加原子,例如 addWidget($User, $widget) 和 removeWidget(...)),具体取决于您的操作。只要您知道它们在做什么,这里就允许使用每个功能;) 映射器没有“禁止”或“必备功能”。
    猜你喜欢
    • 2011-11-29
    • 2011-10-05
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2010-12-30
    • 2012-01-31
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多