_美到极致不是无可增加,而是无可减少。 -- Antonie de Saint-Exupery_
##2.18.1 资源服务
资源可以理解成接口开发过程中所使用到的第三方系统、功能,如数据库,COOKIE、缓存;而服务则是指领域驱动设计中无状态的服务操作,如加密、过滤器、加载器等。
而在PhalApi中,资源和服务更多是通过DI来统一进行管理。并且我们使用资源服务来统称这两者。
在使用PhalApi进行开发时,应该分别从以下三个层面来使用资源服务。
+ 1、基本使用
+ 2、高级应用
+ 3、定制扩展
其中,基本使用是指使用框架默认提供的特性、功能,只需要稍微修改调整一下配置(甚至连配置都不需要修改)即可使用;
高级应用是指切换使用具有同类特性、功能的资源服务,对客户端而言,其实现的功能是等价的,只在于内部实现不同,通常此层面适用于有不同需求的应用场景;
最后是,定制扩展则是充满活力、生气的做法,对于项目需要用到而框架未提供的,都可以通过此方式进行定制、扩展。
##2.18.2 仍然以缓存为例
下面以大家熟悉的缓存为例,分别说明这三个层面的演进使用。
###(1)基本使用
在./Public/init.php初始化文件中,我们可以去掉对Memcache的注释,从而在项目启用cache这一资源服务。
```javascript
//缓存 - Memcache/Memcached
DI()->cache = function () {
return new PhalApi_Cache_Memcache(DI()->config->get('sys.mc'));
};
```
或者,我们还需要根据配置的MC不同,稍微更改一下./Config/sys.php中对应的配置:
```javascript
/**
* MC缓存服务器参考配置
*/
'mc' => array(
'host' => '127.0.0.1',
'port' => 11211,
),
```
然后,就可以在项目中如前面说的那样使用cache进行对缓存进行操作。
```javascript
//设置缓存
DI()->cache->set($key, $value, $expireTime);
//读取缓存
$rs = DI()->cache->get($key);
```
###(2)高级应用
但是我们都知道,缓存的实现方案以及存储的方式多种多样,包括但不限于:数据库缓存、文件缓存、COOKIE/session缓存、Redis缓存、APC缓存。
假设我们需要切换到Redis缓存,则可以在init.php初始化中,把DI()->cache注册成Redis缓存即可。
```javascript
DI()->cache = function () {
return new PhalApi_Cache_Redis(DI()->config->get('sys.redis'));
};
```
同时,在./Config/sys.php中添加对应的配置:
```javascript
'redis' => array(
'host' => '127.0.0.1',
'port' => 9527,
),
```
###(3)定制扩展
毫无疑义,实际项目需要面对的开发场景更为复杂,可能需要使用到加密、压缩、分片或者其他处理手段,又可能使用其他存储媒介。
当框架基本的特性无法满足时,这时就需要考虑进行定制扩展了。值得庆幸的是,实现这一点并不难。一如往常那样,我们需要 **先实现、再注册** 。
####实现资源服务接口
很多通常的资源服务,我们都统一了接口规约。在[1.19]-DI服务速查:各资源服务一览表 中可以查到每个资源服务所需要实现的接口。
如这次的缓存接口类是:
```javascript
<?php
interface PhalApi_Cache {
/**
* 设置缓存
*
* @param string $key 缓存key
* @param mixed $value 缓存的内容
* @param int $expire 缓存有效时间,单位秒,非时间戳
*/
public function set($key, $value, $expire = 600);
/**
* 读取缓存
*
* @param string $key 缓存key
* @return mixed 失败情况下返回NULL
*/
public function get($key);
/**
* 删除缓存
*
* @param string $key
*/
public function delete($key);
}
```
我们可以先在项目中,实现此接口,如:
```javascript
class Common_MyCache implements PhalApi_Cache {
// ... ...
}
```
具体的实现,这里不再举例。
####再注册
当实现好子类后,我们便可以在init.php初始化文件中,切换到我们自己的定制类。
```javascript
DI()->cache = 'Common_MyCache';
```
##2.18.3 实现、定制化你的资源服务
正如《项目百态》书中隐藏的美模式一节中写道的“恰恰相反,只有减少特性才能提升设计的美感。最好的设计都是功能明确又留有答题,也是易于测试的,即使要作修改,也不会带来新的麻烦。”
是以,作为一个框架,我们应当以发散的方式去设计;但为了能为应用提供可用的功能,我们又应当以收敛的方式去实现。如果我们提供的功能不足以满足大部分主流的业务场景,那么我们至少需要提供可扩展的空间。
类似的场景,还包括有接口签名、对接口参数的获取与接口结果的返回。当大家在进行项目开发过程中,有不同的场景需求时,可以按上面介绍的三个层面分别进行。
先尝试使用简单、默认的方式进行配置解决,再切换到框架或已有的解决方案,最后再尝试扩展自己的定制类。
- 欢迎使用PhalApi!
- 接口,从简单开始!
- [1.1]-下载与安装
- [1.2]-创建一个自己的项目
- [1.3]-在线体验
- [1.4]-文档、帮助和官网
- [1.10]-对PhalApi框架的抉择
- [1.11]-快速入门(backup)
- [1.12]-参数规则:接口参数规则配置
- [1.13]-统一的接口请求方式:_sevice=XXX.XXX
- [1.14]-统一的返回格式和结构:ret-data-msg
- [1.15]-数据库操作:基于NotORM的使用及优化
- [1.16]-配置读取:内外网环境配置的完美切换
- [1.17]-日记纪录:简化版的日记接口
- [1.18]-快速函数:人性化的关怀
- [1.19]-DI服务速查:各资源服务一览表
- [1.20]-DB操作:数据库基本操作速查
- [1.21]-类的自动加载:遵循PEAR包的命名规范
- [1.22]-签名验证:自定义签名规则
- [1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回
- [1.24]-缓存策略:更灵活地可配置化的多级缓存
- [1.25]-国际化翻译:为走向国际化提前做好翻译准备
- [1.26]-数据安全:数据对称加密方案
- [1.27]-精益开发:更富表现力的Model层和重量级数据获取的应对方案
- [1.28]-COOKIE:对COOKIE原生态的支持及记忆加密升级版
- [1.29]-开放与封闭:多入口和统一初始化
- [1.30]-保持的力量:接口开发最佳实践
- [1.31]-新型计划任务:以接口形式实现的计划任务
- [2.11]-核心思想:DI依赖注入-让资源更可控
- [2.12]-海量数据:可配置的分库分表
- [2.13]-接口调试:在线SQL语句查看与性能优化
- [2.14]-测试驱动开发:意图导向编程下的接口开发
- [2.15]-演进:新型计划任务续篇
- [2.16]-领域驱动设计:应对复杂领域业务的Domain层
- [2.17]-微服务:Api接口服务层
- [2.18]-定制化:资源服务的再实现
- [2.19]-扩展库:可重用的扩展类库
- [2.20]-约定编程:架构明显的编程风格
- [2.21]-服务器统一部署方案简明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益项目和团队建设
- [3.1]-扩展类库:微信开发
- [3.2]-扩展类库:代理模式下phprpc协议的轻松支持
- [3.3]-扩展类库:基于PHPMailer的邮件发送
- [3.4]-扩展类库:优酷开放平台接口调用
- [3.5]-扩展类库:七牛云存储接口调用
- [3.6]-扩展类库:新型计划任务
- [3.8]-扩展类库:用户、会话和第三方登录集成
- [3.9]-扩展类库:swoole支持下的长链接和异步任务实现
- [3.11]-扩展类库:基于FastRoute的快速路由
- [4.2]-开发实战2:模拟优酷开放平台接口项目开发
- [4.3]-开发实战3:一个简单的小型项目开发(奔跑吧兄弟投票活动)
- [5.1]-架构与思想:PhalApi核心设计和思想解读
- [5.2]-杂谈:扯一些PhalApi的前世和今生
- [5.3]-框架总结:术语表和PHP开发建议
- [5.4]-许可
- [5.5]-联系和加入我们
- [5.6]-更新日记
- [5.8]-致框架贡献者:加入PhalApi开源指南
- [6.1]-基于接口查询语言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi视频教程
- 附录1:接口文档参考模板