_美到極致不是無可增加,而是無可減少。 -- 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:接口文檔參考模板