【问题标题】:Service Layers: Should it hide the domain models' API?服务层:是否应该隐藏领域模型的 API?
【发布时间】:2012-04-19 09:27:49
【问题描述】:

我正在加载 Zend 1.11 并与 Doctrine 1.2 集成,并且已经阅读了很多关于使用服务层的内容。

据我了解,服务层位于业务逻辑之上,在控制器和域模型之间添加了一层。

但是,我被困在如何实际实现服务层上,主要是因为我有点不确定我应该为服务类定义什么类型的 API。

首先,给定一个服务类App_Service_Memberships,它将处理具有App_Model_Group 和用户为App_Model_User 的业务实体组:

服务类的 API 是否应该通过接受或返回所述领域模型的实例来公开类的组合?

或者服务类的 API 是否应该通过仅接受或返回整数或数组等本机数据类型来隐藏类的组合?

就像说:

class App_Service_Memberships
{

    public function addUserToGroup($user_id, $group_id)
    {

        //Create or retrieve domain models here and operate on them; handle persistence.
        $membership = new App_Model_Membership();

        $membership->member->user_id = $user_id;
        $membership->group->group_id = $group_id;
        $membership->join_date = date("Y-m-d H:i:s");

        $membership->save();

        return $membership->toArray();
    }

    public function getMembersOfGroup($group_id)
    {
         $groupMembers = array();

         //Query objects here with Doctrine or the ORM of choice...

         foreach($results as $membership){
             $groupMembers[] = $membership->member->toArray();
         }

         return $groupMembers;
    }
}

控制器只是将整数作为参数(来自表单的数据,或来自其他服务类的输出)传递给服务类,完全忽略了所涉及的域模型。

相对于:

class App_Service_Memberships
{
    public function addUserToGroup(App_Model_UserInterface $user, App_Model_Group $group)
    {
        //Create or retrieve domain models here and operate on them; handle persistence.
        $membership = new App_Model_Membership();

        $membership->member = $user;
        $membership->group = $group;
        $membership->join_date = date("Y-m-d H:i:s");

        $membership->save();

        return $membership;
    }

    public function getMembersOfGroup(App_Model_Group $group)
    {
         $groupMembers = array();

         //Query memberships here

         foreach($results as $membership){
             $groupMembers[] = $membership->member;
         }

         return $groupMembers;
    }
}

控制器在哪里可以处理其范围内的域模型,并将它们传递给服务类?

您认为哪种做法更好?

【问题讨论】:

    标签: php model-view-controller service-layer


    【解决方案1】:

    ...服务类的 API 是否应该通过仅接受或返回整数或数组等原生数据类型来隐藏类的组合?

    是的,这是理想的。如果您强制服务的客户端(在这种情况下为控制器)传递预先构建的域实体(用户),则强制客户端了解有关域的很多信息。不应该。

    您的服务方法也可以是静态的(但不一定是)。

    真的 需要服务类上的App_ 前缀。不确定这在 ZF 社区何时开始,但它已经被货物崇拜至死,真的没有必要。我通常将服务(以及所有特定于应用程序的东西)放在lib 下。更具体地说,我使用src/main/lib,它与src/test/*src/vendor/lib 配合得很好。

    至于返回值...我通常让服务方法返回某种集合。数组很好;然而,更丰富的集合对象在许多情况下非常有用(但不是强制性的)。有时我只是使用 Zend Paginator 对象来务实。它不是可用的最丰富的集合对象,但它适用于 OOTB。

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 2014-04-03
      • 2012-02-04
      • 1970-01-01
      相关资源
      最近更新 更多