#phalapi-進階篇3(自動加載和攔截器)#php
##前言## 先在這裏感謝phalapi框架創始人@dogstar,爲咱們提供了這樣一個優秀的開源框架.git
最近工做上事情比較多因此更新比較慢但願你們見諒!這一次帶來的是對於此框架自動加載機制的一個小引導,簡單的聊聊是如何實現此類機制的,瞭解以後要如何使用,在就一同探討一下如何使用自動加載來構建本身的公用函數以及攔截器,和如何使用攔截器,在這裏在此強調一下,在進階篇中談論思想會比較多你們能夠慢慢消化不少地方都是此框架優秀的地方,拿出來分享是爲了你們更好的瞭解框架而且能夠運用到本身的代碼中去!json
附上:api
官網地址:http://www.phalapi.net/數組
開源中國Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release服務器
##1. 自動加載機制##app
關於自動加載使用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的構造函數post
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 歡迎你們的加入!