TemplateMethod 模板方法模式是一种让抽象模板的子类「完成」一系列算法的行为策略。换而言之,它是一种非常适合框架库的骨架

用户只需要实现子类的一种方法,其父类便可去搞定这项工作了

半年前有个任务是为认证中心部门制作一个 API 统一框架,部门的技术选型是 Yaf 框架,原因是它的轻量级和速度快

但是由于没有一个详细的架构,开发不受控制,拥有很大的自主性。所以需要规范一个统一的接口开发流程

请求流入控制器的步骤没有改变,新增一个控制器抽象基类直接继承 Yaf\Controller_Abstract,普通的控制器再继承基类

流程的模板用 trait 来实现的效果如下:

ApiTemplate.php 接口模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
trait ApiTemplate
{
protected $response;

public final funtion runAction()
{
try {
$this->setParams();

$this->checkParams();

$this->response = $this->exec();

$this->checkResponse();

$this->returnResponse();
} catch (Exception $e) {
$this->handleError($e);
}
}

//用参数处理插件代替
abstract function setParams();

//参数校验
abstract function checkParams();

//主方法
abstract function exec();

//用响应处理插件代替
abstract function checkResponse();

//返回响应
abstract function returnResponse();

//统一错误处理
abstract function handleError(Exception $e);
}

当请求 api.host/foo 接口时,会解析到 BarController 中的 run() 方法

让开发们按约定设置好 请求参数响应 的配置,只需要关心逻辑处理并写在 exec() 中,整个流程就统一了