美文网首页Phal 开发笔记
Phal 的 ADM 模式 (Api-Domain-Model)

Phal 的 ADM 模式 (Api-Domain-Model)

作者: 爱绑架的猫 | 来源:发表于2019-03-12 16:30 被阅读0次

Phal 推荐使用 ADM 模式主要是一种代码的调用的思想,是一种从大到小,由远及近,由粗到细的思想,简单来说, Api 这一层主要负责数据的检验和处理,然后把初步处理的数据送给 Domain 层,调用 Domain 层的方法实现更复杂更细节的操作,而在 Domain 层,对于数据库的 CURD 操作则全都由 Model 层来操作,Domain 层负责处理数据和调用Model 层获取数据等,最终把结果返回给 Api 层,Api 层把需要的数据整理好以后发送给客户端。
这个 A-D-M 的调用方向是不可逆的,也就是说 Model 层不可以调用 Domain 或者 Api 层的方法,同样 Domain 层也不可以调用 Api 层的方法,这样保证代码逻辑清晰,方便寻找错误和后期维护。

以下是 Phal 提供的各个层应该做的一些事情的大概描述:

Api接口服务层应该做:

  • 应该:对用户登录态进行必要的检测
  • 应该:控制业务场景的主流程,创建领域业务实例,并进行调用
  • 应该:进行必要的日记纪录
  • 应该:返回接口结果
  • 应该:调度领域业务层

Api接口服务层不应该做:

  • 不应该:进行业务规则的处理或者计算
  • 不应该:关心数据是否使用缓存,或进行缓存相关的直接操作
  • 不应该:直接操作数据库
  • 不应该:将多个接口合并在一起

Domain领域业务层应该做:

  • 应该:体现特定领域的业务规则
  • 应该:对数据进行逻辑上的处理
  • 应该:调度数据模型层或其他领域业务层

Domain领域业务层不应该做:

  • 不应该:直接实现数据的操作,如添加并实现缓存机制

Model数据模型层应该:

  • 应该:进行数据库的操作
  • 应该:实现缓存机制

Api 接口层

​ Api接口层称为接口服务层,负责对客户端的请求进行响应,处理接收客户端传递的参数,进行高层决策并对领域业务层进行调度,最后将处理结果返回给客户端。

这里我们只讲一下接口方法的对参数的处理方法

<?php
namespace App\Api;

use PhalApi\Api;

class User extends Api {
    
    /**
    * 登录接口
    * @desc 用户登录接口
    * 
    */
    public function login() {
        return 'this is login function !';
    }
    
    /**
    * 参数接收接口
    */
    public function getRules() {
        return array(
            'login' => array(// login 是指的这个类中的方法名
                'username' => array(// username 是login 方法 的参数名
                    'require' => true,    // 是否必须
                    'min' => 1,           // 小于等于几位
                    'max' => 10,          // 大于等于几位
                    'name' => 'username', // 传输时的名称 ?username=xxx
                    'default' => '张三',  // 如果不传默认值
                    'type' => 'string',   // 传输类型限制, int,string,boolean...
                    'desc' => '用户名',    // 参数描述
                    'source' => 'post',   // 传输方式
                    'regex' => '正则',    // 正则验证方式
                    'format' => 'utf8'    // 传输编码
                )
            )
        );
    }
}

?>

Domain 领域层

PhalApi使用的是ADM分层模式,Domain是连接Api层与Model层的桥梁。

这里简单写一段代码展示一下 Domain 层操作。

/src/app/Domain/Good.php

<?php
namespace App\Domain;

// 获取 Good model 
use App\Model\Goods as Goods;

class Good {

    // 获取所有商品
    public function getOne() {
        $good = new Goods();
        $data = $good->get(1);
        return $data;
    }
}
?>

Model 模型层

Model层称为数据模型层,负责技术层面上对数据信息的提取、存储、更新和删除等操作,数据可来自内存,也可以来自持久化存储媒介,甚至可以是来自外部第三方系统。虽然PhalApi的Model层是广义上的数据层,但考虑到大部分数据都是来自于数据库的操作,所以这一章将重点讲述如何进行数据库操作。

数据库配置

/config/dbs.php

return array(
    /**
     * DB数据库服务器集群
     */
    'servers' => array(
        'db_master' => array(                         //服务器标记
            'host'      => '127.0.0.1',             //数据库域名
            'name'      => 'phalapi',               //数据库名字
            'user'      => 'root',                  //数据库用户名
            'password'  => '',                      //数据库密码
            'port'      => 3306,                  //数据库端口
            'charset'   => 'UTF8',                  //数据库字符集
        ),
    ),

    /**
     * 自定义路由表
     */
    'tables' => array(
        //通用路由
        '__default__' => array(
            'prefix' => 'tbl_',
            'key' => 'id',
            'map' => array(
                array('db' => 'db_master'),
            ),
        ),
    ),
);
NotORM

NotORM是一个优秀的开源PHP类库,可用于操作数据库。PhalApi的数据库操作,主要是依赖此NotORM来完成。

获取 NotORM 实例

在PhalApi中,全部数据库操作都要经过NotORM实例来进行

这里我们主要讲在 model 中调用 NotORM 实例的方法

/src/Model/Good.php

<?php
namespace App\Model;    
// 引入 NotORM  
use PhalApi\Model\NotORMModel as NotORM;
// 让 Model 类继承这个类
class Good extends NotORM {
    
    public function getAll() {
        // 获取当前这个类所代表的表的 ORM 实例 $this->getORM() 代表的是 tbl_good 表
        $good = $this->getORM();   
        $data = $good->fetchOne(); // 从 tbl_good 表中获取一条记录
        return $data;    
    }
}   
    
?>

上面只是 NotORM 的一个简单的实例,它还有很多操作数据库的方法,大家可以去官方文档中详细去看,这里只做简单介绍。

相关文章

网友评论

    本文标题:Phal 的 ADM 模式 (Api-Domain-Model)

    本文链接:https://www.haomeiwen.com/subject/ibynpqtx.html