W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
美到極致不是無(wú)可增加,而是無(wú)可減少。 -- Antonie de Saint-Exupery
資源可以理解成接口開(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ù)。
其中,基本使用是指使用框架默認(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ò)展。
下面以大家熟悉的緩存為例,分別說(shuō)明這三個(gè)層面的演進(jìn)使用。
在./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);
但是我們都知道,緩存的實(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,
),
毫無(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è) 。
很多通常的資源服務(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),這里不再舉例。
當(dāng)實(shí)現(xiàn)好子類(lèi)后,我們便可以在init.php初始化文件中,切換到我們自己的定制類(lèi)。
DI()->cache = 'Common_MyCache';
正如《項(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)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: