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 的一个简单的实例,它还有很多操作数据库的方法,大家可以去官方文档中详细去看,这里只做简单介绍。
网友评论