<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                #phalapi-進階篇3(自動加載和攔截器)# ![](http://webtools.qiniudn.com/master-LOGO-20150410_50.jpg) ##前言## ***先在這里感謝phalapi框架創始人@dogstar,為我們提供了這樣一個優秀的開源框架.*** 最近工作上的事情比較多,所以文檔更新得比較慢,還望大家見諒!接下來為大家帶來的是對此框架自動加載機制的一個小的引導,簡單地來聊聊它是如何實現此類機制的,并在了解之后要怎樣去使用。同時再探討一下如何使用自動加載來構建自己的公用函數以及攔截器,包括如何使用攔截器等,在這里強調一下,在進階篇中談論思想會比較多,大家可以慢慢去消化。涉及的很多地方都是此框架優秀的地方所在,因此,拿出來分享是為了讓大家能夠更好的了解phalapi框架,并且可以運用到自己的代碼中去! 附上: 喵了個咪的博客:[w-blog.cn](w-blog.cn) 官網地址:[http://www.phalapi.net/](http://www.phalapi.net/ "PhalApi官網") 開源中國Git地址:[http://git.oschina.net/dogstar/PhalApi/tree/release](http://git.oschina.net/dogstar/PhalApi/tree/release "開源中國Git地址") ##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 歡迎大家的加入!** ####[上一章](/wikis/%5b7.8%5d-phalapi-%e8%bf%9b%e9%98%b6%e7%af%872(DI%e4%be%9d%e8%b5%96%e6%b3%a8%e5%85%a5%e5%92%8c%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f).html) [文檔首頁](/wikis/) [下一章](/wikis/%5b7.10%5d-phalapi-%e8%bf%9b%e9%98%b6%e7%af%874(notorm%e8%bf%9b%e9%98%b6%e4%bb%a5%e5%8f%8a%e4%ba%8b%e5%8a%a1%e6%93%8d%e4%bd%9c).html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看