phalapi-進階篇3(自動載入和攔截器)
#phalapi-進階篇3(自動載入和攔截器)#
##前言## 先在這裡感謝phalapi框架創始人@dogstar,為我們提供了這樣一個優秀的開源框架.
最近工作上事情比較多所以更新比較慢希望大家見諒!這一次帶來的是對於此框架自動載入機制的一個小引導,簡單的聊聊是如何實現此類機制的,瞭解之後要如何使用,在就一同探討一下如何使用自動載入來構建自己的公用函式以及攔截器,和如何使用攔截器,在這裡在此強調一下,在進階篇中談論思想會比較多大家可以慢慢消化很多地方都是此框架優秀的地方,拿出來分享是為了大家更好的瞭解框架並且可以運用到自己的程式碼中去!
附上:
開源中國Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release
##1. 自動載入機制##
關於自動載入使用phalapi框架的大家已經特別熟悉了,三層結構自動載入請求呼叫大家基本上感覺不到自動載入機制的存在,其實我們早就已經註冊我們的檔案,只是有一套完整的機制來封裝這類事務讓我們摸不著,我們的介面檔案就是在index.php已經註冊了
//裝載你的介面
DI()->loader->addDirs(array('Demo', 'Library'));
大家不妨進入到addDirs裡面瞧瞧
public function addDirs($dirs) { if(!is_array($dirs)) { $dirs = array($dirs); } $this->dirs = array_merge($this->dirs, $dirs); }
其實當我們使用到addDirs的時候框架內部只是把我們定義好的路徑存了起來,其實關鍵的地方已經在初始化PhalApi_Loader的時候被觸發了,我們來一起看下PhalApi_Loader的建構函式
public function __construct($basePath, $dirs = array()) { $this->setBasePath($basePath); if (!empty($dirs)) { $this->addDirs($dirs); } spl_autoload_register(array($this, 'load')); }
第一句方法的意思是設定根目錄,後面一個判斷條件和我們使用addDirs是一樣的作用,那麼問題來了spl_autoload_register做了什麼,官方給出的解釋是這樣的
將函式註冊到SPL__autoload函式佇列中。如果該佇列中的函式尚未啟用,則啟用它們
引數
欲註冊的自動裝載函式。如果沒有提供任何引數,則自動註冊autoload的預設實現函式spl_autoload()
其實說白了就是當例項化類的時候找不到可以用的類的時候會來請求在spl_autoload_register中定義好的處理方法,在此框架匯中配置的處理函式也就是PhalApi_Loader/load函式
關於具體的如何實現如果匹配如果找到路徑在如何引入這裡就不一一說明了,當我們每次是new 一個類的時候都會去匹配有沒有合適的,當沒有合適的情況的時候,我們new的類名就是傳遞到PhalApi_Loader/load函式中去處理,根據框架規則引入我們需要的檔案.
##2. 公用函式和攔截器##
當我們會使用自動載入機制了之後我們就可以來構建我們專案的公用函式和攔截器了,為什麼要使用公用函式呢,在大部分請求下我們一套框架可能支援多個專案,當然專案與專案之間有不同的方法函式等等,但是也有公用的比如debug啊傳送簡訊啊等等一些所有專案都可能去用到的一些功能性函式,或者是一些針對專案的攔截器啊
###2.1 公共函式###
首先在我們的根目錄建立一個資料夾叫做general通用的意思,裡面分別有兩個資料夾Common(受TP的影響)和Intercept兩個檔案,我們在裡面放入我們自己的檔案,當然需要按照正確的規則比如Common_Base等
然後我們要使用的話當然要註冊我們這個general檔案作為自帶載入檔案,然後註冊自己需要用的類,如下:
//載入專案通用檔案
DI()->loader->addDirs('General');
//通用函式基礎類
DI()->base = new Common_Base();
###2.2 攔截器###
對於API來說攔截器的意義是巨大了,為什麼這麼說呢應為API是提供伺服器的,我們可以用攔截器做很多的時候,比如限制開放介面,引數轉移,json解包,請求解密,token校驗等等一些處理都可以在內部進行.
//攔截器
$Intercept = new Intercept_app_default();
//轉換引數
$_REQUEST = $Intercept->turnparameter($_REQUEST);
可以作為參考,攔截器接受所有的post和get引數然後再內部統一做處理,引數轉換,請求解密,token校驗這些都是日常用到的不詳提,這裡哪一個有代表性的來說明一下就是json解包,為什麼要json解包呢,應為在很多公司使用請求傳參的時候都是封裝成一個json請求過來的,框架接受是能接受到,但是無法使用框架自帶的引數完整性校驗機制了,令我非常難受(也有很多朋友也遇到此類問題),所有自己寫了一個解包方法
//遞迴解包
function test($params, $server){
if(is_array($params)){
foreach($params as $k => $v){
$server[$k] = $v;
$server = test($v, $server);
}
}
return $server;
}
//模擬一個json陣列
$params = array(
'a' => array(
'c' => 3,
'd' => 4
),
'b' => 2,
);
$server = array();
var_dump(test($params, $server));
我們獲取到的返回結果是**array(4) { ["a"]=> array(2) { ["c"]=> int(3) ["d"]=> int(4) } ["c"]=> int(3) ["d"]=> int(4) ["b"]=> int(2) }**也就是把陣列中的底層元素全部浮到了和a,b同級的目錄並且也保證了a的陣列完整性,這邊必須要注意啊同名問題
##3. 總結##
本小節,主要講述了一下關於自動載入的機制,以及為什麼要使用攔截器已經目的和怎麼讓json通過攔截器也能使用框架的校驗機制,那麼今天就到這裡了,希望此教程能夠給你們帶來幫助,在下一小節將會model層和事務進行已經深入的瞭解,祝大家天天開心~
注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!
官網QQ交流群:421032344 歡迎大家的加入!