如何深入理解PhalApi框架三层结构Api+Domain+Model模式

1. Api+Domain+Model

其实这样的三层结构和java中的web+service+dao比较像,和我们平常所说的MVC开发模式也是非常想象。只是说web和api一个进行页面显示一个不进行页面显示这个区别,本博文主要着重讲一下这三层在Phalapi中分工是怎么样的,他们分别担当者什么样的角色,需要做什么样的事情。

1.1 Api层

为什么说Api层像java中的web层呢,因为他们有一个共同的特性就是接受请求和返回结果。只不过java中没有表现得那么强烈,它会通过控制器把请求转发到service层作处理,并将处理结果在页面展示,所以Api更像担当控制器(C)的作用。

Api层中需要做的事情如下:

a. 注册接口/定义接口和控制请求参数

这是首先要做的事情,和在web中的url一样,就是添加需要接受的参数以及对参数进行验证,如下:

 

  1. public function getRules(){  
  2.     return array(  
  3.         'goodsCategoryList' => array(  
  4.             'parent_id' => array('name' => 'parent_id','type'=>'int', 'default' => '0','desc'=>'父类id'),  
  5.         ),  
  6.         'goodsSecAndThirdCategoryList' => array(  
  7.             'parent_id' => array('name' => 'parent_id','type'=>'int', 'require' => true,'desc'=>'父类id'),  
  8.         ),  
  9.     );  
  10. }  

b. 进行业务、逻辑的拼接

在这里进行业务、逻辑拼接,比如说是查询商品分类列表(依查询商品为例)接口需要做两件事情,第一查询出商品的分类列表信息,第二查询把查询出的信息进行 返回,应该是如下样式:


  1. /** 
  2.   * 获取商品分类列表 
  3.   * @desc 用于获取商品分类列表 
  4.   * @return int ret 返回接口状态码,其中:200成功,400非法请求,500服务器错误 
  5.   * @return int code 返回请求状态码,其中:1正常,0不正常 
  6.   * @return array data 返回数据信息 
  7.   * @return int id 商品分类id 
  8.   * @return string name 商品分类名称 
  9.   * @return string mobile_name 手机端显示商品分类名 
  10.   * @return int parent_id 父类id 
  11.   * @return srting parent_id_path 家族图谱 
  12.   * @return int level 分类等级 
  13.   * @return int sort_order 顺序显示 
  14.   * @return int is_show 是否显示,其中1显示,0不显示 
  15.   * @return string image 分类图片路径 
  16.   * @return int is_hot 是否推荐为热门分类,其中1为推荐,0为不推荐 
  17.   * @return int cat_group 分类分组默认0 
  18.   * @return int commission_rate 分佣比例 
  19.   * @return string msg 返回信息提示,成功:success,失败:error 
  20.   * @demo http://localhost/Api/Public/tpshop/index.php?service=Goods.goodsCategoryList 
  21.   */  
  22.  public function goodsCategoryList(){  
  23.      $goods_domain = new Domain_Goods();  
  24.      $info = $goods_domain->goodsCategoryList($this->parent_id);  
  25.      return $info;  
  26.  }  


1.2 Domain层

Domain层主要负责的是具体的业务实现,如数据获取,一个Domain方法就是一个小的业务具体实现(注意尽量把业务划分得细一点方便通用)


  1. public function goodsCategoryList($parent_id){  
  2.         $goods_model = new Model_Goods();  
  3.         $result = $goods_model->goodsCategoryList($parent_id);  
  4.         return $result;  
  5.     }  


1.3 Model层

Model层其实无需多讲,也就是把数据库操作单独提炼出来统一处理,如下:


  1. public function goodsCategoryList($parent_id){  
  2.        $goods_model = DI()->notorm->goods_category;  
  3.        $goodsCategoryList = $goods_model->where("parent_id = $parent_id AND is_show=1")->order("parent_id_path,sort_order desc")->fetchRows();  
  4.        if(!empty($goodsCategoryList)){  
  5.            $info['code'] = 1;  
  6.            $info['data'] = $goodsCategoryList;  
  7.            $info['msg'] = 'success';  
  8.        }else {  
  9.            $info['code'] = 0;  
  10.            $info['msg'] = 'error';  
  11.        }  
  12.        return $info;  
  13.    }  


2. 三层结合使用的好处

2.1 结构清晰,互不干扰

就我个人感觉来说,在实际开发中使用这样的三层结构带来的最大的好处在于结构清晰,为什么这么说呢?因为每一层需要做的事情都是非常独立的,你永远不会在A PI层中看到数据操作的代码,所以在排查问题的时候,如果是数据出了问题,肯定不会去API层里面去找,这样就非常方便错误的定位,再者就是代码可读性非常高,相对 于mvc框架来说这样的好处是非常明显的。

2.2 高度解耦,灵活高可用

带来的第二个很重要的好处就是解耦和高可用,高可用体现在Api可以重复利用Domain,Domain可以重复利用Model,这样可以减少很多不必要的代码量。如果相互 的关系仅仅只是拼接(除非是结果会互相影响)的情况下就实现了解耦。

2.3 分工合作,提高效率

在有这样的一套规范之后在分工合用时,对方不需要去看你的代码具体实现了什么,只需要看你这个方法干了什么,直接拿起来用就可以了,当然是在业务划分成小块 的情况下,而且可以很明确的划分出来模块,当你需要用到对方的模块的时候只需要让对方提供即可,这样可以增加模块的专注性,从而提高合作开发的效率。

3. 总结

其实在刚刚接触这个框架的时候,我也是特别不能理解这样划分的作用,在后面的开发和别人的交流中进行了一些尝试后,发现这样用起来确实有很多的好处,希望今天的博文能让大家理解这样的一种规范可以带来很多的好处,并且自己去尝试和使用。

posted @ 2017-02-16 11:24  hyt前端小菜鸟  阅读(1137)  评论(0编辑  收藏  举报