定制化:資源服務(wù)的再實(shí)現(xiàn)

2018-11-21 21:20 更新

美到極致不是無(wú)可增加,而是無(wú)可減少。 -- Antonie de Saint-Exupery

2.18.1 資源服務(wù)

資源可以理解成接口開(kāi)發(fā)過(guò)程中所使用到的第三方系統(tǒng)、功能,如數(shù)據(jù)庫(kù),COOKIE、緩存;而服務(wù)則是指領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中無(wú)狀態(tài)的服務(wù)操作,如加密、過(guò)濾器、加載器等。
而在PhalApi中,資源和服務(wù)更多是通過(guò)DI來(lái)統(tǒng)一進(jìn)行管理。并且我們使用資源服務(wù)來(lái)統(tǒng)稱(chēng)這兩者。

在使用PhalApi進(jìn)行開(kāi)發(fā)時(shí),應(yīng)該分別從以下三個(gè)層面來(lái)使用資源服務(wù)。

  • 1、基本使用
  • 2、高級(jí)應(yīng)用
  • 3、定制擴(kuò)展

其中,基本使用是指使用框架默認(rèn)提供的特性、功能,只需要稍微修改調(diào)整一下配置(甚至連配置都不需要修改)即可使用; 高級(jí)應(yīng)用是指切換使用具有同類(lèi)特性、功能的資源服務(wù),對(duì)客戶(hù)端而言,其實(shí)現(xiàn)的功能是等價(jià)的,只在于內(nèi)部實(shí)現(xiàn)不同,通常此層面適用于有不同需求的應(yīng)用場(chǎng)景; 最后是,定制擴(kuò)展則是充滿(mǎn)活力、生氣的做法,對(duì)于項(xiàng)目需要用到而框架未提供的,都可以通過(guò)此方式進(jìn)行定制、擴(kuò)展。

2.18.2 仍然以緩存為例

下面以大家熟悉的緩存為例,分別說(shuō)明這三個(gè)層面的演進(jìn)使用。

(1)基本使用

在./Public/init.php初始化文件中,我們可以去掉對(duì)Memcache的注釋?zhuān)瑥亩陧?xiàng)目啟用cache這一資源服務(wù)。

//緩存 - Memcache/Memcached
DI()->cache = function () {
    return new PhalApi_Cache_Memcache(DI()->config->get('sys.mc'));
};

或者,我們還需要根據(jù)配置的MC不同,稍微更改一下./Config/sys.php中對(duì)應(yīng)的配置:

    /**
     * MC緩存服務(wù)器參考配置
     */
     'mc' => array(
           'host' => '127.0.0.1',
           'port' => 11211,
     ),

然后,就可以在項(xiàng)目中如前面說(shuō)的那樣使用cache進(jìn)行對(duì)緩存進(jìn)行操作。

//設(shè)置緩存
DI()->cache->set($key, $value, $expireTime);

//讀取緩存
$rs = DI()->cache->get($key);

(2)高級(jí)應(yīng)用

但是我們都知道,緩存的實(shí)現(xiàn)方案以及存儲(chǔ)的方式多種多樣,包括但不限于:數(shù)據(jù)庫(kù)緩存、文件緩存、COOKIE/session緩存、Redis緩存、APC緩存。

假設(shè)我們需要切換到Redis緩存,則可以在init.php初始化中,把DI()->cache注冊(cè)成Redis緩存即可。

DI()->cache = function () {
    return new PhalApi_Cache_Redis(DI()->config->get('sys.redis'));
};

同時(shí),在./Config/sys.php中添加對(duì)應(yīng)的配置:

     'redis' => array(
           'host' => '127.0.0.1',
           'port' => 9527,
     ),

(3)定制擴(kuò)展

毫無(wú)疑義,實(shí)際項(xiàng)目需要面對(duì)的開(kāi)發(fā)場(chǎng)景更為復(fù)雜,可能需要使用到加密、壓縮、分片或者其他處理手段,又可能使用其他存儲(chǔ)媒介。

當(dāng)框架基本的特性無(wú)法滿(mǎn)足時(shí),這時(shí)就需要考慮進(jìn)行定制擴(kuò)展了。值得慶幸的是,實(shí)現(xiàn)這一點(diǎn)并不難。一如往常那樣,我們需要 先實(shí)現(xiàn)、再注冊(cè) 。

實(shí)現(xiàn)資源服務(wù)接口

很多通常的資源服務(wù),我們都統(tǒng)一了接口規(guī)約。在[1.19]-DI服務(wù)速查:各資源服務(wù)一覽表 中可以查到每個(gè)資源服務(wù)所需要實(shí)現(xiàn)的接口。

如這次的緩存接口類(lèi)是:

<?php

interface PhalApi_Cache {

    /**
     * 設(shè)置緩存
     * 
     * @param string $key 緩存key
     * @param mixed $value 緩存的內(nèi)容
     * @param int $expire 緩存有效時(shí)間,單位秒,非時(shí)間戳
     */
    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);
}

我們可以先在項(xiàng)目中,實(shí)現(xiàn)此接口,如:

class Common_MyCache implements PhalApi_Cache {
     // ... ...
}

具體的實(shí)現(xiàn),這里不再舉例。

再注冊(cè)

當(dāng)實(shí)現(xiàn)好子類(lèi)后,我們便可以在init.php初始化文件中,切換到我們自己的定制類(lèi)。

DI()->cache = 'Common_MyCache';

2.18.3 實(shí)現(xiàn)、定制化你的資源服務(wù)

正如《項(xiàng)目百態(tài)》書(shū)中隱藏的美模式一節(jié)中寫(xiě)道的“恰恰相反,只有減少特性才能提升設(shè)計(jì)的美感。最好的設(shè)計(jì)都是功能明確又留有答題,也是易于測(cè)試的,即使要作修改,也不會(huì)帶來(lái)新的麻煩。”

是以,作為一個(gè)框架,我們應(yīng)當(dāng)以發(fā)散的方式去設(shè)計(jì);但為了能為應(yīng)用提供可用的功能,我們又應(yīng)當(dāng)以收斂的方式去實(shí)現(xiàn)。如果我們提供的功能不足以滿(mǎn)足大部分主流的業(yè)務(wù)場(chǎng)景,那么我們至少需要提供可擴(kuò)展的空間。

類(lèi)似的場(chǎng)景,還包括有接口簽名、對(duì)接口參數(shù)的獲取與接口結(jié)果的返回。當(dāng)大家在進(jìn)行項(xiàng)目開(kāi)發(fā)過(guò)程中,有不同的場(chǎng)景需求時(shí),可以按上面介紹的三個(gè)層面分別進(jìn)行。

先嘗試使用簡(jiǎn)單、默認(rèn)的方式進(jìn)行配置解決,再切換到框架或已有的解決方案,最后再?lài)L試擴(kuò)展自己的定制類(lèi)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)