初識(shí)PhalApi(探索接口服務(wù)開(kāi)發(fā)技術(shù))_第1頁(yè)
初識(shí)PhalApi(探索接口服務(wù)開(kāi)發(fā)技術(shù))_第2頁(yè)
初識(shí)PhalApi(探索接口服務(wù)開(kāi)發(fā)技術(shù))_第3頁(yè)
初識(shí)PhalApi(探索接口服務(wù)開(kāi)發(fā)技術(shù))_第4頁(yè)
初識(shí)PhalApi(探索接口服務(wù)開(kāi)發(fā)技術(shù))_第5頁(yè)
已閱讀5頁(yè),還剩404頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

初識(shí)PhalApi探索接口服務(wù)開(kāi)發(fā)技術(shù)目錄\h第一部分探索\h第1章遇見(jiàn)PhalApi\h1.1PhalApi是什么?\h1.2PhalApi的前世今生\h1.2.1前世:個(gè)人框架zenphpWS3\h1.2.2今生:開(kāi)源框架PhalApi\h1.3接口,從簡(jiǎn)單開(kāi)始!\h1.3.1一個(gè)隱喻\h1.3.2PhalApi框架所做的\h1.4下載與安裝\h1.5創(chuàng)建一個(gè)新項(xiàng)目\h1.6HelloWorld\h1.7對(duì)PhalApi框架的抉擇\h1.7.1適用的場(chǎng)景和項(xiàng)目\h1.7.2敏捷開(kāi)發(fā)和快速交付\h1.7.3約束和關(guān)注\h1.7.4復(fù)雜領(lǐng)域業(yè)務(wù)的應(yīng)對(duì)和解決方案\h1.7.5框架的性能\h1.7.6成熟度與學(xué)習(xí)成本\h本章小結(jié)\h參考資料\h第2章基礎(chǔ)入門\h2.1接口請(qǐng)求\h2.1.1接口服務(wù)URI\h2.1.2參數(shù)規(guī)則\h2.2.3過(guò)濾器與簽名驗(yàn)證\h2.2.4擴(kuò)展你的項(xiàng)目\h2.2接口響應(yīng)\h2.2.1響應(yīng)結(jié)構(gòu)\h2.2.2返回格式\h2.2.3領(lǐng)域特定設(shè)計(jì)與Fiat標(biāo)準(zhǔn)\h2.2.4在線調(diào)試\h2.2.5擴(kuò)展你的項(xiàng)目\h2.3細(xì)說(shuō)ADM模式\h2.3.1何為Api-Domain-Model模式?\h2.3.2會(huì)講故事的Api接口層\h2.3.3專注領(lǐng)域的Domain業(yè)務(wù)層\h2.3.4廣義的Model數(shù)據(jù)層\h2.3.5ADM職責(zé)劃分與調(diào)用關(guān)系\h2.3.6擴(kuò)展你的項(xiàng)目\h2.4配置\h2.4.1配置的簡(jiǎn)單讀取\h2.4.2配置管理策略\h2.4.3使用Yaconf擴(kuò)展快速讀取配置\h2.4.4擴(kuò)展你的項(xiàng)目\h2.5數(shù)據(jù)庫(kù)操作\h2.5.1NotORM簡(jiǎn)介\h2.5.2數(shù)據(jù)庫(kù)配置\h2.5.3Model基類的使用\h2.5.4CURD基本操作\h2.5.5事務(wù)操作、關(guān)聯(lián)查詢和其他操作\h2.5.6分表分庫(kù)策略\h2.5.7擴(kuò)展你的項(xiàng)目\h2.6緩存策略\h2.6.1簡(jiǎn)單本地緩存\h2.6.2高速集群緩存\h2.6.3多級(jí)緩存策略\h2.6.4擴(kuò)展你的項(xiàng)目\h2.7日志\h2.7.1簡(jiǎn)化版的日記接口\h2.7.2擴(kuò)展你的項(xiàng)目\h2.8COOKIE\h2.8.1COOKIE的基本使用\h2.8.2記憶加密升級(jí)版\h2.8.3擴(kuò)展你的項(xiàng)目\h2.9i18n國(guó)際化\h2.9.1語(yǔ)言設(shè)定\h2.9.2翻譯包\h2.9.3通用的翻譯寫法\h2.9.4擴(kuò)展你的項(xiàng)目\h本章小結(jié)\h參考資料\h第3章高級(jí)主題\h3.1讓資源更可控的依賴注入\h3.1.1何為依賴注入?\h3.1.2依賴注入的基本使用\h3.1.3架構(gòu)明顯的編程風(fēng)格\h3.1.4依賴注入的好處\h3.1.5DI資源速查表\h3.2PEAR包命名規(guī)范下的自動(dòng)加載\h3.2.1PEAR包命名規(guī)范\h3.2.2掛靠式自動(dòng)加載\h3.2.3初始化文件和入口文件的區(qū)別\h3.3自動(dòng)生成的在線文檔\h3.3.1在線接口列表文檔\h3.3.2在線接口詳情文檔\h3.4接口查詢語(yǔ)言與SDK包\h3.4.1用一句話來(lái)描述接口請(qǐng)求\h3.4.2接口查詢語(yǔ)言設(shè)計(jì)理念與使用示例\h3.4.3更好的建議\h3.4.4Java版SDK包的使用說(shuō)明\h3.4.5Ruby版SDK包的使用說(shuō)明\h3.5腳本命令的使用\h3.5.1phalapi-buildapp命令\h3.5.2phalapi-buildtest命令\h3.5.3phalapi-buildsqls命令\h3.5.4phalapi-buildcode命令\h3.6可重用的擴(kuò)展類庫(kù)\h3.6.1擴(kuò)展類庫(kù)簡(jiǎn)介\h3.6.2安裝、配置注冊(cè)與使用\h3.6.3常用擴(kuò)展類庫(kù)介紹\h3.6.4從微架構(gòu)到擴(kuò)展類庫(kù)的演進(jìn)\h3.7超越HTTP/HTTPS協(xié)議\h3.7.1構(gòu)建RESTfulAPI\h3.7.2使用PHPRPC協(xié)議\h3.7.3利用SOAP搭建WebServices\h3.7.4創(chuàng)建命令行CLI項(xiàng)目\h3.7.5小結(jié)\h本章小結(jié)\h參考資料\h第4章不只是編碼\h4.1測(cè)試驅(qū)動(dòng)開(kāi)發(fā)\h4.1.1意圖導(dǎo)向編程、原則與模式\h4.1.2在PhalApi下進(jìn)行TDD的一般步驟\h4.1.3對(duì)接口類的三角驗(yàn)證\h4.1.4“造假”技巧\h4.1.5用一分鐘,盡早發(fā)現(xiàn)問(wèn)題\h4.1.6小結(jié)\h4.2設(shè)計(jì)模式的應(yīng)用\h4.2.1形式服從于功能\h4.2.2在項(xiàng)目開(kāi)發(fā)中的應(yīng)用\h4.2.3在擴(kuò)展類庫(kù)中的應(yīng)用\h4.2.4在PhalApi框架中的應(yīng)用\h4.2.5優(yōu)先考慮最終使用的方式\h4.2.6小結(jié)\h4.3小步重構(gòu)\h4.3.1對(duì)過(guò)去代碼的優(yōu)化,對(duì)將來(lái)代碼的雕琢\h4.3.2改善既有的代碼\h4.3.3以模式為指導(dǎo)進(jìn)行重構(gòu)\h4.3.4重構(gòu)這條路\h本章小結(jié)\h參考資料\h第二部分\h第5章全新的創(chuàng)業(yè)項(xiàng)目\h5.1項(xiàng)目背景\h5.2如何開(kāi)啟一個(gè)新項(xiàng)目\h5.2.1需求分析與模塊拆分\h5.2.2數(shù)據(jù)庫(kù)設(shè)計(jì)\h5.2.3為項(xiàng)目創(chuàng)建Git代碼倉(cāng)庫(kù)\h5.2.4部署開(kāi)發(fā)環(huán)境\h5.3具體接口服務(wù)開(kāi)發(fā)\h5.3.1制定接口規(guī)范\h5.3.2日歷事件模塊的三個(gè)接口服務(wù)\h5.2.3日歷事件接口服務(wù)的開(kāi)發(fā)\h5.3.4查看日歷事件列表接口服務(wù)的開(kāi)發(fā)\h5.3.5操作日歷事件接口服務(wù)的開(kāi)發(fā)\h5.3.6圖片上傳接口服務(wù)的開(kāi)發(fā)\h5.3.7在完成的基礎(chǔ)上追求完美\h5.3.8再談單元測(cè)試驅(qū)動(dòng)開(kāi)發(fā)\h5.4與客戶端的聯(lián)調(diào)\h5.4.1與移動(dòng)App的聯(lián)調(diào)\h5.4.2與管理后臺(tái)的聯(lián)調(diào)\h5.5上線發(fā)布\h5.5.1上線checklist\h5.5.2通過(guò)FTP或其他方式發(fā)布\h5.2.3發(fā)布驗(yàn)收\(chéng)h5.6項(xiàng)目小結(jié)\h第6章重寫歷史遺留項(xiàng)目\h6.1項(xiàng)目背景\h6.2重寫歷史遺留項(xiàng)目的前期準(zhǔn)備\h6.2.1數(shù)據(jù)庫(kù)遷移\h6.2.2剖析已有的接口系統(tǒng)\h6.3新接口系統(tǒng)的設(shè)計(jì)\h6.3.1客戶端接入規(guī)范\h6.3.2服務(wù)端開(kāi)發(fā)規(guī)范\h6.3.3多入口,多模塊\h6.3.4通過(guò)系統(tǒng)變量維護(hù)服務(wù)器配置\h6.3.5在線接口文檔\h6.3.6擴(kuò)展類庫(kù)的應(yīng)用\h6.4重寫既有的接口服務(wù)\h6.4.1數(shù)據(jù)庫(kù)分表\h6.4.2用特征草圖分解“萬(wàn)能類”\h6.4.3消化復(fù)雜的領(lǐng)域業(yè)務(wù)\h6.5開(kāi)發(fā)新增的接口服務(wù)\h6.5.1有趣的體重?cái)?shù)據(jù)\h6.5.2善于解決復(fù)雜問(wèn)題的設(shè)計(jì)模式\h6.5.3如何測(cè)試耗時(shí)的計(jì)劃任務(wù)\h6.5精益求精\h6.5.1獲取家庭圈信息的接口服務(wù)\h6.5.2使用Xhprof剖析性能\h6.5.3Autobench壓力測(cè)試與高效緩存\h6.5.3通過(guò)Phing進(jìn)行版本的發(fā)布與回滾\h6.6成果回顧\h第7章一個(gè)極致的項(xiàng)目\h7.1項(xiàng)目背景\h7.2Api接口層的規(guī)范\h7.2.1一個(gè)接口服務(wù),一個(gè)文件\h7.2.2更簡(jiǎn)單請(qǐng)求的形式\h7.2.3參數(shù)規(guī)則配置\h7.2.4接口實(shí)現(xiàn)與返回規(guī)范\h7.2.5注釋規(guī)范與自動(dòng)生成文檔\h7.3Domain領(lǐng)域?qū)拥囊?guī)范\h7.3.1實(shí)體\h7.3.2服務(wù)\h7.3.3值對(duì)象\h7.4Model數(shù)據(jù)層的規(guī)范\h7.4.1常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù)對(duì)接\h7.4.2NoSQL陣容\h7.4.3遠(yuǎn)程接口的調(diào)用\h7.4.4一切皆文件\h7.5這只個(gè)開(kāi)始\h第三部分再進(jìn)一步\h第8章PhalApi完美詮釋\h8.1核心設(shè)計(jì)講解\h8.1.1共性和可變性分析回顧\h8.12解讀主流程\h8.1.3UML靜態(tài)類結(jié)構(gòu)\h8.2性能剖析\h8.2.1Xhprof性能報(bào)告\h8.2.2Ab基準(zhǔn)測(cè)試\h8.3靜態(tài)代碼質(zhì)量\h8.3.1Sonar分析報(bào)告\h8.3.2PHPMetrics分析報(bào)告\h8.4追求極致的單元測(cè)試\h8.5DI與擴(kuò)展類庫(kù)\h8.5.1再談DI依賴注入\h8.5.2可重用的擴(kuò)展類庫(kù)\h8.6PhalApi內(nèi)省\h本章小結(jié)\h第9章如何有效設(shè)計(jì)接口框架\h9.1正統(tǒng)\h9.1.1定位\h9.1.2正名\h9.2在開(kāi)始之前\h9.2.1揣測(cè)它的使用\h9.2.2如何用于開(kāi)發(fā)?\h9.2.3異常,擴(kuò)展與不確定性\h9.2.4忠于自己\h9.3吾有框架初成形\h9.3.1SOLID原則與穩(wěn)定依賴\h9.3.2協(xié)作與交流\h9.3.3論編程范式\h9.4精雕細(xì)琢\h9.4.1可測(cè)試性\h9.4.2性能之巔\h9.4.3代碼質(zhì)量\h9.4.4從優(yōu)秀到卓越\h9.5有效交付\h9.5.1幫助用戶認(rèn)識(shí)新框架\h9.5.2文檔\h9.5.3HelloWorld示例\h本章小節(jié)\h10開(kāi)源這條路\h10.1這是一個(gè)美好時(shí)代\h10.2為什么要開(kāi)源?\h10.2.1因?yàn)榕d趣\h10.2.2因?yàn)閾?dān)當(dāng)\h10.3離不開(kāi)的Linux\h10.3.1開(kāi)源\h10.3.2技術(shù)\h10.3.3文化\h10.4領(lǐng)域再細(xì)分\h10.4.1編程語(yǔ)言\h10.4.2開(kāi)源框架\h10.4.3接口框架\h10.5PhalApi開(kāi)源回顧\h10.5.1初為人知\h10.5.2自建社區(qū)\h10.5.3文檔,博客,視頻\h10.5.4邁向2.x全新版本\h尾聲\h附錄A接口服務(wù)文檔模板\h1、功能說(shuō)明\h2、接口服務(wù)URL\h3、接口服務(wù)參數(shù)\h4、返回結(jié)果\h返回字段\h結(jié)果示例\h請(qǐng)求示例

注:原文檔電子版(非掃描),需要的請(qǐng)下載本文檔后留言謝謝。第一部分探索第一部分介紹的是PhalApi的基礎(chǔ)內(nèi)容,以及高級(jí)主題,最后還會(huì)講述除了編碼部分,其他的主題。這一部分,我們將探索如何使用PhalApi進(jìn)行項(xiàng)目開(kāi)發(fā),從對(duì)PhalApi的感性認(rèn)識(shí),再到細(xì)致的基礎(chǔ)開(kāi)發(fā),最后深入到核心的思想和理念。

第1章遇見(jiàn)PhalApi古云此日足可惜,吾輩更應(yīng)惜秒陰。——董必武《惜時(shí)》1.1PhalApi是什么?PhalApi,簡(jiǎn)稱:π框架,是一個(gè)國(guó)產(chǎn)開(kāi)源的PHP輕量級(jí)接口開(kāi)發(fā)框架,專注于接口服務(wù)開(kāi)發(fā),支持HTTP/SOAP/RPC協(xié)議,可用于快速搭建微服務(wù)、RESTful接口或WebServices。1.2PhalApi的前世今生1.2.1前世:個(gè)人框架zenphpWS3PhalApi最初是始于2012年個(gè)人畢業(yè)論文的項(xiàng)目開(kāi)發(fā)需要。由于當(dāng)時(shí)課題是開(kāi)發(fā)一個(gè)基于旅游軌跡的圖片分享平臺(tái),需要開(kāi)發(fā)一套提供給App客戶端使用的后臺(tái)服務(wù)接口。然而,在實(shí)際項(xiàng)目開(kāi)發(fā)中,發(fā)現(xiàn)身邊很多團(tuán)隊(duì)在使用PHP進(jìn)行接口開(kāi)發(fā)時(shí),往往是很簡(jiǎn)單,或者說(shuō)是很粗爆的,如直接使用fopen()函數(shù)獲取遠(yuǎn)程接口的執(zhí)行結(jié)果再加以處理。尷尬的是,當(dāng)時(shí)在尋找一個(gè)可以用于快速后臺(tái)接口開(kāi)發(fā)的PHP框架時(shí),沒(méi)找到合適貼切的開(kāi)源框架。準(zhǔn)確來(lái)說(shuō)來(lái),沒(méi)找到一個(gè)專注于接口開(kāi)發(fā)的開(kāi)源框架。基于此,萌生了自主研發(fā)一個(gè)接口框架的想法。經(jīng)過(guò)到圖書館和網(wǎng)上查閱整理多方資料、知識(shí)和理論,和一段時(shí)間的設(shè)計(jì)及編碼后,便延生了最初的接口框架,并命名為:zenphpWS3。其中,zen表示開(kāi)源、php表示用PHP開(kāi)發(fā)、WS表示W(wǎng)ebService、3表示支持SOAP、HTTP或RPC三種協(xié)議以及JSON、XML或數(shù)組等多種格式的返回。zenphpWS3很好地支撐畢業(yè)論文項(xiàng)目的開(kāi)發(fā),并初步具備了一個(gè)框架的基本特質(zhì)與思想。但經(jīng)過(guò)一年的全職工作,以及學(xué)習(xí)、研究眾多優(yōu)秀開(kāi)源構(gòu)架后,發(fā)現(xiàn)還存在很多有待改善的地方。所以,當(dāng)再次使用zenphpWS3進(jìn)行新接口項(xiàng)目開(kāi)發(fā)時(shí),我便在開(kāi)發(fā)具體應(yīng)用接口服務(wù)的同時(shí),也有意識(shí)地在對(duì)接口框架進(jìn)行完善和重構(gòu),并融入框架所需要的特性、原則和模式。如可重用、IoC、SOILD設(shè)計(jì)原則、組件和容器等。至此,通過(guò)不斷演進(jìn)迭代,一個(gè)更好的接口框架便慢慢浮現(xiàn)了出來(lái)。1.2.2今生:開(kāi)源框架PhalApi與此同時(shí),我們迎來(lái)了移動(dòng)互聯(lián)網(wǎng)的浪潮。很多大的企業(yè)都提供了開(kāi)放平臺(tái),如騰訊開(kāi)放平臺(tái)、新浪微博開(kāi)放平臺(tái)、優(yōu)酷開(kāi)放平臺(tái)等。而對(duì)于中型公司或者初創(chuàng)團(tuán)隊(duì),則需要為自主的APP開(kāi)發(fā)提供特定領(lǐng)域業(yè)務(wù)功能的接口服務(wù)。也就是說(shuō),越來(lái)越多的項(xiàng)目需要像我當(dāng)初那樣開(kāi)發(fā)接口服務(wù),但也可能同樣會(huì)像我當(dāng)初那樣面臨找不到合適貼切開(kāi)源框架的困境。秉著希望能幫助更多同學(xué)快速開(kāi)發(fā)接口項(xiàng)目的初衷,我便再次對(duì)此接口框架進(jìn)行重構(gòu)優(yōu)化,于2015年正式走向開(kāi)源,并更名為:PhalApi,簡(jiǎn)稱:π框架。正如PHPUnit的作者SebastianBergmann所說(shuō)的那樣:Drivenbyhispassiontohelpdevelopersbuildbettersoftware.同樣,我們希望通過(guò)PhalApi,可以:一來(lái),支撐輕量級(jí)接口項(xiàng)目的快速開(kāi)發(fā);二來(lái),闡明如何更好地進(jìn)行接口開(kāi)發(fā)、設(shè)計(jì)和維護(hù);三來(lái),分享優(yōu)秀的編程思想、實(shí)用的工具和精益求精的技藝。最初的接口框架就在這樣的背景和研究下出來(lái)了。1.3接口,從簡(jiǎn)單開(kāi)始!1.3.1一個(gè)隱喻假設(shè)我們有一條這樣的表達(dá)式:1+1=2

顯然,這是非常簡(jiǎn)單,且易于理解的。但倘若我們?cè)谥虚g添加一些復(fù)雜性后:1+(96-867+700-6+7-30/10+100-27)+1=2

同樣可以獲得相同的結(jié)果,但表達(dá)卻羞澀難懂,且容易出錯(cuò)。你可能會(huì)覺(jué)得好笑:怎么可能會(huì)有人把這么簡(jiǎn)單的問(wèn)題復(fù)雜化呢?還編寫這么累贅的代碼?然而,如果你回顧一下以往接觸過(guò)的項(xiàng)目或留意一下身邊正在運(yùn)行的代碼,你會(huì)發(fā)現(xiàn),這種情況是真實(shí)存在的。在不同的領(lǐng)域開(kāi)發(fā)不同的項(xiàng)目,各自需求不同,所編寫的代碼也就不盡相同。縱使這樣,即使我們不能把代碼簡(jiǎn)化到最理想的狀態(tài),但至少可以通過(guò)努力以達(dá)到“編寫人容易理解的代碼”這一最佳狀態(tài)。一如這樣:1+(0)+1=2

1.3.2PhalApi框架所做的使用PhalApi框架進(jìn)行接口項(xiàng)目開(kāi)發(fā),我們不能保證最終編寫出來(lái)的項(xiàng)目代碼一定會(huì)“短而美”,因?yàn)楦嗟拇a編寫來(lái)自于你雙手的輸入、來(lái)自你自己切身的思考和設(shè)計(jì)。但我們希望PhalApi可以在支持接口快速開(kāi)發(fā)的基礎(chǔ)上,為你和更多開(kāi)發(fā)團(tuán)隊(duì)提供關(guān)于接口項(xiàng)目開(kāi)發(fā)的一些技藝、參考和幫助。所以,與其他很多關(guān)注服務(wù)器性能的框架不同,PhalApi更加關(guān)注的是人的心情、開(kāi)發(fā)效率和團(tuán)隊(duì)合作,而這些正是通過(guò)約束與規(guī)范、測(cè)試驅(qū)動(dòng)開(kāi)發(fā)、自動(dòng)化工具、持續(xù)集成和敏捷開(kāi)發(fā)等途徑可以達(dá)成的。這一切一切,都要從代碼的編寫開(kāi)始。畢竟我們作為專業(yè)軟件開(kāi)發(fā)人士,代碼是我們連接世界的媒介。而接口代碼的編寫,又應(yīng)從簡(jiǎn)單開(kāi)始。泡一杯咖啡,讓我們開(kāi)始吧。1.4下載與安裝PhalApi框架的最新版本的代碼,可以到Github進(jìn)行下載。/phalapi/phalapi

也可以到國(guó)內(nèi)的碼云上進(jìn)行下載。/dogstar/PhalApi

這兩個(gè)倉(cāng)庫(kù)的代碼會(huì)同步一致,開(kāi)發(fā)人員可根據(jù)自己的喜歡選擇使用。其中,release分支為中文穩(wěn)定版;release-en分支為英文穩(wěn)定版。需要使用PHP5.3.3及以上版本。安裝如同其他的框架一樣,將下載的框架壓縮包上傳到服務(wù)器后解壓即可。結(jié)合自己的喜愛(ài)與項(xiàng)目需要,可以采用Apache、XAMPP、MicrosoftIIS等。根據(jù)使用的服務(wù)器不同,配置也不一樣。本書所使用的環(huán)境是:PHP5.3.10Nginx1.1.19PhalApi1.4.0Ubuntu12.04(64位)所以在這里,本書統(tǒng)一約定使用PhaApi1.4.0版本,并且推薦使用Nginx作為服務(wù)器。以這里的環(huán)境安裝為例,假設(shè)框架解壓的目錄為:/path/to/PhalApi/Public,則首先需要添加Nginx配置文件,然后重啟Nginx,最后添加HOST并訪問(wèn)。即首先,新建一個(gè)配置文件:#vim/etc/nginx/sites-available/

并添加以下參考配置:server{

listen80;

server_name;

root/path/to/PhalApi/Public;

charsetutf-8;

location/{

indexindex.htmlindex.htmindex.php;

}

location~\.php${

fastcgi_split_path_info^(.+\.php)(/.+)$;

fastcgi_pass:9000;

fastcgi_indexindex.php;

includefastcgi_params;

fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;

}

access_loglogs/.access.log;

error_loglogs/.error.log;

}

接著,創(chuàng)建軟鏈:#ln-s/etc/nginx/sites-available//etc/nginx/sites-enabled/

重啟Nginx服務(wù):$/etc/init.d/nginxrestart

并在服務(wù)器的/etc/hosts文件里添加:

最后在瀏覽器訪問(wèn)Demo的默認(rèn)接口服務(wù),測(cè)試接口是否可以正常訪問(wèn),如請(qǐng)求:/demo/

正常情況下,會(huì)看到類似以下這樣的返回結(jié)果。{

"ret":200,

"data":{

"title":"HelloWorld!",

"content":"PHPer您好,歡迎使用PhalApi!",

"version":"1.4.0",

"time":1492346885

},

"msg":""

}

溫馨提示:為了可視化JSON結(jié)果,Chrome瀏覽器可安裝JSONView擴(kuò)展,F(xiàn)irefox可以安裝JSON-handel擴(kuò)展。1.5創(chuàng)建一個(gè)新項(xiàng)目安裝好后,可以使用在線可視化安裝向?qū)?lái)創(chuàng)建一個(gè)新的項(xiàng)目。安裝向?qū)г谀夸?/Public/install/下,在瀏覽器輸入/install/便可訪問(wèn)此安裝向?qū)?。安裝界面如下:圖1-1安裝向?qū)щS后按照提示,一步步操作即可。創(chuàng)建新項(xiàng)目過(guò)程,會(huì)要求輸入項(xiàng)目名稱。假設(shè)我們需要為商城創(chuàng)建一個(gè)項(xiàng)目,并命名為:shop,那么安裝完成后訪問(wèn)效果如下。圖1-2新建shop項(xiàng)目的運(yùn)行效果這時(shí),可以看到新建了以下目錄和文件。$tree./Shop/./Public/shop/

./Shop/

├──Api

│└──Default.php

├──Common

├──Domain

├──Model

└──Tests

./Public/shop/

├──checkApiParams.php

├──index.php

└──listAllApis.php

對(duì)于各個(gè)目錄,簡(jiǎn)單說(shuō)明如下:./Shop:放置項(xiàng)目源代碼,每個(gè)項(xiàng)目對(duì)應(yīng)一個(gè)目錄./Shop/Api:接口服務(wù)類目錄./Shop/Domain:領(lǐng)域業(yè)務(wù)類目錄./Shop/Model:數(shù)據(jù)模型類目錄./Shop/Common:公共目錄./Shop/Tests:?jiǎn)卧獪y(cè)試目錄以上都是外界不可直接訪問(wèn)的目錄,下面則是對(duì)外可訪問(wèn)的目錄和文件。./Public/shop:外部可訪問(wèn)的目錄./Public/shop/index.php:入口文件./Public/shop/listAllApis.php:在線接口列表文檔./Public/shop/checkApiParams.php:在線接口詳情文檔關(guān)于各個(gè)目錄和各個(gè)文件的作用,后續(xù)會(huì)作進(jìn)一步說(shuō)明。至此,我們已經(jīng)取到了階段性的成果。我們完成了框架的安裝與部署,還創(chuàng)建了一個(gè)新的項(xiàng)目。接下來(lái),讓我們繼續(xù)探索一下,如何在PhalApi下進(jìn)行具體的接口編碼開(kāi)發(fā)。1.6HelloWorld遵循國(guó)際慣例,這里編寫的第一個(gè)接口也是HelloWorld。這是一個(gè)非常簡(jiǎn)單的接口,主要功能是返回“HelloWorld”這串字符。繼續(xù)使用上面已創(chuàng)建的shop項(xiàng)目。首先,創(chuàng)建一個(gè)接口類文件./Shop/Api/Welcome.php,并在這里實(shí)現(xiàn)主要的功能。//./Shop/Api/Welcome.php

<?php

classApi_WelcomeextendsPhalApi_Api{

publicfunctionsay(){

return'HelloWorld';

}

}

然后,便可以對(duì)接口進(jìn)行訪問(wèn)了。如最簡(jiǎn)單的方式,還是使用瀏覽器來(lái)訪問(wèn)。接口訪問(wèn)的格式為:接口域名+入口路徑+?service=XXX.XXX,所以此接口服務(wù)對(duì)應(yīng)的鏈接為:/shop/?service=Welcome.Say

結(jié)果默認(rèn)以JSON格式返回,即正常情況下會(huì)看到:{"ret":200,"data":"HelloWorld","msg":""}

以上代碼和運(yùn)行結(jié)果截圖如下。圖1-3HelloWorld代碼與運(yùn)行結(jié)果是不是發(fā)現(xiàn)接口開(kāi)發(fā)很簡(jiǎn)單?當(dāng)然,這里只是一個(gè)很簡(jiǎn)單的HelloWorld示例。實(shí)際項(xiàng)目開(kāi)發(fā)中,所遇到的業(yè)務(wù)場(chǎng)景會(huì)更為復(fù)雜,所面臨的技術(shù)挑戰(zhàn)也會(huì)更為深?yuàn)W。雖然是一個(gè)簡(jiǎn)單示例,但也很好地幫助了我們對(duì)PhalApi的開(kāi)發(fā)和使用有了感性的認(rèn)識(shí),同時(shí)察覺(jué)到在進(jìn)行接口開(kāi)發(fā)時(shí)需要時(shí)刻保持前瞻性和注重細(xì)節(jié)。例如細(xì)心的讀者會(huì)發(fā)現(xiàn),這里返回的是一個(gè)字符串,若日后需要在這個(gè)接口添加其他字段的返回則難以保持向前兼容性。所以,離細(xì)致的接口開(kāi)發(fā),我們還有一段路要走。希望這本書,可以陪你更好、更順暢、更愉悅地度過(guò)這段美妙的旅途!1.7對(duì)PhalApi框架的抉擇能使用框架來(lái)進(jìn)行項(xiàng)目開(kāi)發(fā),和知道為何使用此框架進(jìn)行項(xiàng)目開(kāi)發(fā)明顯不同。對(duì)框架的選擇,名義上是架構(gòu)師的職責(zé),但對(duì)于充滿好奇心和有著更強(qiáng)求知欲的開(kāi)發(fā)人員來(lái)說(shuō),同樣應(yīng)該給予關(guān)注。之所以選擇一個(gè)框架進(jìn)行項(xiàng)目開(kāi)發(fā),表面上是為了減少不必要的重復(fù)代碼;但更深層次,則是為了減少開(kāi)發(fā)周期、統(tǒng)一開(kāi)發(fā)規(guī)范、降低項(xiàng)目風(fēng)險(xiǎn),最終快速迭代、持續(xù)交付,不致于項(xiàng)目失控。在決定使用PhalApi框架前,對(duì)于此框架是否適用于即將啟動(dòng)的項(xiàng)目進(jìn)行一番思索,是大有裨益的。通過(guò)推定框架,有助于避免因采用不當(dāng)?shù)目蚣芏鴮?duì)項(xiàng)目造成不必要的阻力。1.7.1適用的場(chǎng)景和項(xiàng)目PhalApi框架特別適用于當(dāng)前為各移動(dòng)App或其他后臺(tái)系統(tǒng)開(kāi)發(fā)遠(yuǎn)程接口服務(wù)??捎糜诖罱ǜ咴L問(wèn)量、大數(shù)據(jù)存儲(chǔ)的接口項(xiàng)目,可以掛靠多個(gè)接口項(xiàng)目,也可以很好地支持多個(gè)終端、多個(gè)版本、多個(gè)訪問(wèn)入口。此外,還提供各種可重用的擴(kuò)展類庫(kù),便于快速開(kāi)發(fā)。基于此,我們采用了主流設(shè)計(jì),即將框架設(shè)計(jì)成默認(rèn)使用HTTP協(xié)議訪問(wèn),并以JSON格式返回請(qǐng)求結(jié)果。因?yàn)镠TTP協(xié)議和JSON格式,都是當(dāng)前大眾所熟悉的。1.7.2敏捷開(kāi)發(fā)和快速交付雖然框架和工程實(shí)踐間沒(méi)有必然的聯(lián)系,但我想其中應(yīng)該會(huì)有一些微妙的聯(lián)系。一種代碼編寫的方式會(huì)形成一種開(kāi)發(fā)的風(fēng)格;一種開(kāi)發(fā)風(fēng)格會(huì)奠定一個(gè)團(tuán)隊(duì)的合作氛圍;一個(gè)團(tuán)隊(duì)的合作氛圍會(huì)決定項(xiàng)目交付的質(zhì)量。而PhalApi所提倡和希望做到的正是通過(guò)讓接口開(kāi)發(fā)更簡(jiǎn)單,讓后臺(tái)開(kāi)發(fā)人員心情更愉悅,從而為客戶端提供高質(zhì)量的接口服務(wù)。此外,結(jié)合重構(gòu)、測(cè)試驅(qū)動(dòng)開(kāi)發(fā)和持續(xù)集成等,可以讓你的項(xiàng)目如虎添翼,在快速交付的同時(shí),體驗(yàn)編碼開(kāi)發(fā)的樂(lè)趣。1.7.3約束和關(guān)注架構(gòu)約束程序。約束有時(shí)會(huì)讓開(kāi)發(fā)者處處受阻。但好的約束能夠統(tǒng)一規(guī)范而不致于項(xiàng)目代碼凌亂不堪,也不會(huì)輕易地允許低級(jí)開(kāi)發(fā)新手犯下一些本可避免的BUG。正如,我們都討厭等待紅綠燈,但我們必須肯定它對(duì)交通和生命安全保障的作用。1.7.4復(fù)雜領(lǐng)域業(yè)務(wù)的應(yīng)對(duì)和解決方案正如前面說(shuō)到的,我們關(guān)注在海量數(shù)據(jù)下為移動(dòng)App提供穩(wěn)定的接口,我們提倡敏捷開(kāi)發(fā)下的快速交付。所以我們?nèi)サ襞c接口開(kāi)發(fā)無(wú)關(guān)的功能,沒(méi)有提供視圖渲染和模板解析的操作。但只是這樣而已嗎?不!我們還關(guān)注對(duì)復(fù)雜領(lǐng)域業(yè)務(wù)的應(yīng)對(duì)和解決方案。如果我們PhalApi框架所關(guān)注的,也是你們項(xiàng)目所關(guān)注的,那么我們有理由相信PhalApi能為你的項(xiàng)目帶來(lái)很多友好的約束和貼心的幫助。1.7.5框架的性能很多框架都要強(qiáng)調(diào)其能提供的性能,然后PHP本身就是動(dòng)態(tài)的腳本語(yǔ)言,要想提高項(xiàng)目的運(yùn)行速度,就是要進(jìn)行減法,即減少不必要的PHP代碼。但是前面強(qiáng)調(diào)性能的框架則做了與其承諾矛盾的做法:為框架增添了很多項(xiàng)目可能不需要用到的功能。明顯地就是一系列既定的執(zhí)行流程和偵聽(tīng)事件、回調(diào)、調(diào)度等等。而這些,勢(shì)必會(huì)對(duì)性能有所影響,特別當(dāng)應(yīng)用項(xiàng)目不需要這些特性卻又不能定制簡(jiǎn)化時(shí),框架所謂的強(qiáng)悍功能會(huì)適得其反。對(duì)于這一塊,我們則提供了極大的空間。因?yàn)?,入口和初始化文件,我們可以自由定制。除了一些必要的加載外,很多都可以支持自定義和定制化。而且我們也使用Autobench進(jìn)行了壓力測(cè)試和通過(guò)XHprof進(jìn)行了性能剖析,證明PhalApi框架在性能上確實(shí)如我們預(yù)料的那樣——快!1.7.6成熟度與學(xué)習(xí)成本不可否認(rèn),PhalApi還是太年輕了。PhalApi正式開(kāi)源于2015年1月,但是我們一直都在努力完善,我們盡量“減少不必要的創(chuàng)新”,我們堅(jiān)持像恒星一般完美支持框架升級(jí),我們盡量提供優(yōu)秀的文檔、及時(shí)的溝通和技術(shù)幫助。更為重要的是,這是一個(gè)不只為框架而框架的PhalApi框架?!叭朔ǖ?,地法天,天法道,道法自然”。以前經(jīng)常聽(tīng)說(shuō)老子這句話,但對(duì)于其中的意思最初是不明白的,甚至誤解的。“法”字,在這里是學(xué)習(xí)、效仿的意思。我則把這句稍微簡(jiǎn)化了一下,精簡(jiǎn)成:人法自然。在自然界中,無(wú)論是石頭縫之間的小草,公園里植物,還是山上的生態(tài)環(huán)境,不管你來(lái)不來(lái),它們都一直欣欣而向榮、充滿活力。我們應(yīng)該學(xué)習(xí)自然這種品質(zhì),忠于自己。PhalApi也一樣,一直在努力成長(zhǎng),保持生氣,為開(kāi)源社區(qū)負(fù)責(zé)。不會(huì)因?yàn)槭褂玫娜硕嗔司兔詠y,也不會(huì)因?yàn)槭褂玫娜松倬屯V共磺?。在開(kāi)發(fā)過(guò)程中,對(duì)于PhalApi不能很好解決和支持的問(wèn)題,你也可以考慮嘗試優(yōu)化框架,將某一目標(biāo)或?qū)傩蕴嵘良軜?gòu),其他團(tuán)隊(duì)成員則可從中獲益。相信你會(huì)發(fā)現(xiàn),在PhalApi下,你可以輕松做到這一點(diǎn):小步快跑下的浮現(xiàn)式設(shè)計(jì)。本章小結(jié)PhalApi是一個(gè)國(guó)產(chǎn)開(kāi)源的PHP輕量級(jí)接口開(kāi)發(fā)框架,專注于接口服務(wù)開(kāi)發(fā)。對(duì)于接口,我們應(yīng)該從簡(jiǎn)單開(kāi)始!但在決定選擇PhalApi進(jìn)行項(xiàng)目開(kāi)發(fā)前,應(yīng)該先評(píng)估一番,看下此框架是否滿足待開(kāi)啟的項(xiàng)目的要求。在這一章,我們還學(xué)習(xí)了PhalApi的下載和安裝,以及如何創(chuàng)建一個(gè)新項(xiàng)目,也嘗試編寫了第一個(gè)HelloWorld程序。做好了這些準(zhǔn)備后,我們便可以踏上新的征途。但在成為一名嫻熟的工匠之前,我們還需要掌握一些基礎(chǔ)知識(shí)。接下來(lái)——參考資料《恰如其份的框架》推定框架。

《浮現(xiàn)式設(shè)計(jì)》

第2章基礎(chǔ)入門我發(fā)現(xiàn),我越是努力,就越發(fā)幸運(yùn)?!猅homasJefferson嫻熟的技藝離不開(kāi)過(guò)硬扎實(shí)的基礎(chǔ)。這一章,我們將開(kāi)始學(xué)習(xí)PhalApi框架中的基礎(chǔ)內(nèi)容,包括作為客戶端如何請(qǐng)求接口服務(wù),作為服務(wù)端如何返回接口結(jié)果,ADM模式的含義和依賴關(guān)系,以及其他常用的基礎(chǔ)功能。為避免內(nèi)容空洞,我們會(huì)盡量結(jié)合前面的商城項(xiàng)目示例,進(jìn)行基礎(chǔ)內(nèi)容的講解。讀者可以在邊學(xué)習(xí)的過(guò)程中,邊實(shí)踐操作,加深理解。在每個(gè)小節(jié)中,我們會(huì)先學(xué)習(xí)一些基本的使用,以便能滿足普遍項(xiàng)目開(kāi)發(fā)的技術(shù)需要。對(duì)于容易誤解、容易出錯(cuò)的地方,我們會(huì)進(jìn)行溫馨提示,列出注意事項(xiàng)以及提供正確的解決方案。在每個(gè)小節(jié)的最后,我們還會(huì)再進(jìn)一步,學(xué)習(xí)如何擴(kuò)展項(xiàng)目的能力,定制自己的功能。2.1接口請(qǐng)求PhalApi默認(rèn)使用的是HTTP/HTTPS協(xié)議進(jìn)行通訊,請(qǐng)求接口的完整URL格式則是:接口域名+入口路徑+?service=Class.Action+[接口參數(shù)]

其中有應(yīng)該單獨(dú)部署的接口域名,不同項(xiàng)目各自的入口路徑,統(tǒng)一約定的service參數(shù),以及可選的接口參數(shù)。下面分別進(jìn)行說(shuō)明。2.1.1接口服務(wù)URI接口域名通常,我們建議對(duì)于接口服務(wù)系統(tǒng),應(yīng)該單獨(dú)部署一個(gè)接口域名,而不應(yīng)與其他傳統(tǒng)的Web應(yīng)用系統(tǒng)或者管理后臺(tái)混合在一起,以便分開(kāi)維護(hù)。假設(shè)我們已經(jīng)有一個(gè)站點(diǎn),其域名為:,現(xiàn)需要為開(kāi)發(fā)一套接口服務(wù)提供給移動(dòng)App使用。直接在已有站點(diǎn)下添加一個(gè)入口以提供服務(wù)的做法是不推薦的,即不建議接口URI是:/api。推薦的做法是,單獨(dú)配置部署一個(gè)新的接口域名,如:。當(dāng)前,我們也可以發(fā)現(xiàn)很多公司都提供了這樣獨(dú)立的接口平臺(tái)。例如:優(yōu)酷開(kāi)放平臺(tái):微信公眾號(hào):新浪微博:如第1章中,我們創(chuàng)建的接口項(xiàng)目,其域名為:。入口路徑入口路徑是相對(duì)路徑,不同的項(xiàng)目可以使用不同的入口。通常在這里,我們會(huì)在部署接口項(xiàng)目時(shí),會(huì)把項(xiàng)目對(duì)外可訪問(wèn)的根目錄設(shè)置到./Public目錄。這里所說(shuō)的入口路徑都是相對(duì)這個(gè)./Public目錄而言的。與此同時(shí),默認(rèn)使用省略index.php的路徑寫法。為了更好地理解這樣的對(duì)應(yīng)關(guān)系,以下是一些示例對(duì)應(yīng)關(guān)系。表2-1入口路徑示例對(duì)應(yīng)關(guān)系項(xiàng)目精簡(jiǎn)的入口路徑完整的入口路徑入口文件位置項(xiàng)目源代碼位置默認(rèn)的演示項(xiàng)目/demo/Public/demo/index.php./Public/demo/index.php./Demo新建的商城項(xiàng)目/shop/Public/shop/index.php./Public/shop/index.php./Shop如框架自帶的演示項(xiàng)目,其目錄是:./Public/demo,對(duì)應(yīng)的訪問(wèn)入口路徑是:/demo;而新建的商城Shop項(xiàng)目的目錄是:./Public/shop,則入口路徑是:/shop。這個(gè)入口路徑是可選的,也可以直接使用根目錄。如果是這樣,則需要調(diào)整./Public/index.php目錄,并且不便于多項(xiàng)目并存的情況。指定接口服務(wù)在PhalApi中,我們統(tǒng)一約定使用service參數(shù)來(lái)指定所請(qǐng)求的接口服務(wù)。通常情況下,此參數(shù)使用GET方式傳遞,即使用$_GET['service'],其格式為:?service=Class.Action。其中Class是對(duì)應(yīng)請(qǐng)求的接口剔除Api_前綴后的類名,Action則是待執(zhí)行的接口類中的方法名。溫馨提示:未指定service參數(shù)時(shí),默認(rèn)使用?service=Default.Index。如請(qǐng)求默認(rèn)的接口服務(wù)可用?service=Default.Index,則相應(yīng)會(huì)調(diào)用Api_Default::Index()這一接口服務(wù);若請(qǐng)求的是?service=Welcome.Say,則會(huì)調(diào)用Api_Welcome::Say這一接口服務(wù)。以下是一些示例。請(qǐng)求默認(rèn)接口服務(wù),省略service/shop/

等效于請(qǐng)求默認(rèn)接口服務(wù)/shop/?service=Default.Index

請(qǐng)求HelloWorld接口服務(wù)/shop/?service=Welcome.Say

接口參數(shù)接口參數(shù)是可選的,根據(jù)不同的接口服務(wù)所約定的參數(shù)進(jìn)行傳遞??梢允荊ET參數(shù),POST參數(shù),或者多媒體數(shù)據(jù)。未定制的情況下,PhalApi既支持GET參數(shù)又支持POST參數(shù)。如使用GET方式傳遞username參數(shù):$curl"/shop/?service=Default.Index&username=dogstar"

也可以用POST方式傳遞username參數(shù):$curl-d"username=dogstar""/shop/?service=Default.Index"

至此,我們已經(jīng)基本了解如何對(duì)接口服務(wù)發(fā)起請(qǐng)求。接下來(lái),讓我們來(lái)看下對(duì)于接口服務(wù)至關(guān)重要的要素——接口參數(shù)。2.1.2參數(shù)規(guī)則接口參數(shù),對(duì)于接口服務(wù)本身來(lái)說(shuō),是非常重要的。對(duì)于外部調(diào)用的客戶端來(lái)說(shuō),同等重要。對(duì)于接口參數(shù),我們希望能夠既減輕后臺(tái)開(kāi)發(fā)對(duì)接口參數(shù)獲取、判斷、驗(yàn)證、文檔編寫的痛苦;又能方便客戶端快速調(diào)用,明確參數(shù)的意義。由此,我們引入了參數(shù)規(guī)則這一概念,即:通過(guò)配置參數(shù)的規(guī)則,自動(dòng)實(shí)現(xiàn)對(duì)參數(shù)的獲取和驗(yàn)證,同時(shí)自動(dòng)生成在線接口文檔。參數(shù)規(guī)則是針對(duì)各個(gè)接口服務(wù)而配置的多維規(guī)則數(shù)組,由PhalApi_Api::getRules()方法返回。其中,參數(shù)規(guī)則數(shù)組的一維下標(biāo)是接口類的方法名,對(duì)應(yīng)接口服務(wù)的Action;二維下標(biāo)是類屬性名稱,對(duì)應(yīng)在服務(wù)端獲取通過(guò)驗(yàn)證和轉(zhuǎn)換化的最終客戶端參數(shù);三維下標(biāo)name是接口參數(shù)名稱,對(duì)應(yīng)外部客戶端請(qǐng)求時(shí)需要提供的參數(shù)名稱。即:publicfunctiongetRules(){

returnarray(

'接口類方法名'=>array(

'接口類屬性'=>array('name'=>'接口參數(shù)名稱',......),

),

);

}

通常情況下,接口類屬性和接口參數(shù)名稱一樣,但也可以不一樣。一種情況是客戶端的接口參數(shù)名稱慣用下劃線分割,即蛇形(下劃線)命名法,而服務(wù)端中則慣用駝峰命名法。例如對(duì)于“是否記住我”,客戶端參數(shù)用is_remember_me,服務(wù)端用isRememberMe。另一種情況是如果參數(shù)名稱較長(zhǎng),為了節(jié)省移動(dòng)網(wǎng)絡(luò)下的流量,也可以針對(duì)客戶端參數(shù)使用有意義的縮寫。如前面的“是否記住我”客戶端縮寫成is_rem_me。在參數(shù)規(guī)則里,可以配置多個(gè)接口類方法名,每個(gè)方法名的規(guī)則,又可以配置多個(gè)接口類屬性,即有多個(gè)接口參數(shù)。配置好參數(shù)規(guī)則后,當(dāng)接口參數(shù)通過(guò)驗(yàn)證后,就可以在接口類方法內(nèi),通過(guò)類成員屬性獲取相應(yīng)的接口參數(shù)。一個(gè)簡(jiǎn)單的示例假設(shè)我們現(xiàn)在需要提供一個(gè)用戶登錄的接口,接口參數(shù)有用戶名和密碼,那么新增的接口類和規(guī)則如下://$vim./Shop/Api/User.php

<?php

classApi_UserextendsPhalApi_Api{

publicfunctiongetRules(){

returnarray(

'login'=>array(

'username'=>array('name'=>'username'),

'password'=>array('name'=>'password'),

),

);

}

publicfunctionlogin(){

returnarray('username'=>$this->username,'password'=>$this->password);

}

}

當(dāng)我們請(qǐng)求此接口服務(wù),并類似這樣帶上username和password參數(shù)時(shí):/shop/?service=User.Login&username=dogstar&password=123456

就可以得到這樣的返回結(jié)果。{"ret":0,"data":{"username":"dogstar","password":"123456"},"msg":""}

這是因?yàn)?,在接口?shí)現(xiàn)類里面getRules()成員方法配置參數(shù)規(guī)則后,便可以通過(guò)類屬性的方式,根據(jù)配置指定的名稱獲取對(duì)應(yīng)的接口參數(shù),如這里的:$this->username和$this->password。更完善的示例在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們需要對(duì)接口參數(shù)有更細(xì)致的規(guī)定,如是否必須、長(zhǎng)度范圍、最值和默認(rèn)值等。繼續(xù)上面的業(yè)務(wù)場(chǎng)景,用戶登錄接口服務(wù)的用戶名參數(shù)和密碼參數(shù)皆為必須,且密碼長(zhǎng)度至少為6個(gè)字符,則可以參數(shù)規(guī)則調(diào)整為://$vim./Shop/Api/User.php

publicfunctiongetRules(){

returnarray(

'login'=>array(

'username'=>array('name'=>'username','require'=>true),

'password'=>array('name'=>'password','require'=>true,'min'=>6),

),

......

配置好后,如果不帶任何參數(shù)再次請(qǐng)求?service=User.Login,就會(huì)被視為非法請(qǐng)求,并得到這樣的錯(cuò)誤提示:{

"ret":400,

"data":[],

"msg":"非法請(qǐng)求:缺少必要參數(shù)username"

}

如果傳遞的密碼長(zhǎng)度不對(duì),也會(huì)得到一個(gè)錯(cuò)誤的返回。溫馨提示:當(dāng)接口參數(shù)非法時(shí),返回的ret都為400,且data為空。在這一章節(jié)中,當(dāng)再次非法返回時(shí),將省略ret與data,以節(jié)省篇幅。三級(jí)參數(shù)規(guī)則配置參數(shù)規(guī)則主要有三種,分別是:系統(tǒng)參數(shù)規(guī)則、應(yīng)用參數(shù)規(guī)則、接口參數(shù)規(guī)則。系統(tǒng)參數(shù)是指被框架保留使用的參數(shù)。目前已被PhalApi占用的系統(tǒng)參數(shù)只有一個(gè),即:service參數(shù)。類型為字符串,格式為:Class.Action,首字母不區(qū)分大小寫,建議統(tǒng)一以大寫開(kāi)頭。以下是一些示例:推薦寫法,類名和方法名開(kāi)頭大寫?service=User.Login

正確寫法,類名和方法名開(kāi)頭都小寫,或方法名全部小寫?service=user.login

?service=user.getbaseinfo

錯(cuò)誤寫法,缺少方法名、缺少點(diǎn)號(hào)分割、使用豎線而非點(diǎn)號(hào)分割?service=User

?service=UserLogin

?service=User|GetBaseInfo

溫馨提示:service參數(shù)中的類名只能開(kāi)頭小寫,否則會(huì)導(dǎo)致linux系統(tǒng)下類文件加載失敗。應(yīng)用參數(shù)是指在一個(gè)接口系統(tǒng)中,全部項(xiàng)目的全部接口都需要的參數(shù),或者通用的參數(shù)。假如我們的商城接口系統(tǒng)中全部的接口服務(wù)都需要必須的簽名sign參數(shù),以及非必須的版本號(hào),則可以在./Config/app.php中的apiCommonRules進(jìn)行應(yīng)用參數(shù)規(guī)則的配置://$vim./Config/app.php

<?php

returnarray(

/**

*應(yīng)用接口層的統(tǒng)一參數(shù)

*/

'apiCommonRules'=>array(

//簽名

'sign'=>array(

'name'=>'sign','require'=>true,

),

//客戶端App版本號(hào),默認(rèn)為:1.4.0

'version'=>array(

'name'=>'version','default'=>'1.4.0',

),

),

......

其配置格式和前面所說(shuō)的接口參數(shù)規(guī)則配置類似,都是一個(gè)規(guī)則數(shù)組。區(qū)別是這里是二維數(shù)組,相當(dāng)于全部方法的公共的接口類屬性。接口參數(shù)是指各個(gè)具體的接口服務(wù)所需要的參數(shù),為特定的接口服務(wù)所持有,獨(dú)立配置。并且進(jìn)一步在內(nèi)部又細(xì)分為兩種:通用接口參數(shù)規(guī)則:使用*作為下標(biāo),對(duì)當(dāng)前接口類全部的方法有效。指定接口參數(shù)規(guī)則:使用方法名作為下標(biāo),只對(duì)接口類的特定某個(gè)方法有效。例如為了加強(qiáng)安全性,需要為全部的用戶接口服務(wù)都加上長(zhǎng)度為4位的驗(yàn)證碼參數(shù)://$vim./Shop/Api/User.php

publicfunctiongetRules(){

returnarray(

'*'=>array(

'code'=>array('name'=>'code','require'=>true,'min'=>4,'max'=>4),

),

'login'=>array(

'username'=>array('name'=>'username','require'=>true),

'password'=>array('name'=>'password','require'=>true,'min'=>6),

),

);

}

現(xiàn)在,當(dāng)再次請(qǐng)求用戶登錄接口,除了要提供用戶名和密碼外,我們還要提供驗(yàn)證碼code參數(shù)。并且,對(duì)于Api_User類的其他方法也一樣。多個(gè)參數(shù)規(guī)則時(shí)的優(yōu)先級(jí)當(dāng)同一個(gè)參數(shù)規(guī)則分別在應(yīng)用參數(shù)、通用接口參數(shù)及指定接口參數(shù)出現(xiàn)時(shí),后面的規(guī)則會(huì)覆蓋前面的,即具體化的規(guī)則會(huì)替換通用的規(guī)則,以保證接口參數(shù)滿足特定場(chǎng)合的定制要求。簡(jiǎn)而言之,多個(gè)參數(shù)規(guī)則的優(yōu)先級(jí)從高到下,分別是(正如你想到的那樣):1、指定接口參數(shù)規(guī)則2、通用接口參數(shù)規(guī)則3、應(yīng)用參數(shù)規(guī)則4、系統(tǒng)參數(shù)規(guī)則(通常忽略,當(dāng)前只有service)參數(shù)規(guī)則配置具體的參數(shù)規(guī)則,根據(jù)不同的類型有不同的配置選項(xiàng),以及一些公共的配置選項(xiàng)。目前,主要的類型有:字符串、整數(shù)、浮點(diǎn)數(shù)、布爾值、時(shí)間戳/日期、數(shù)組、枚舉類型、文件上傳和回調(diào)函數(shù)。表2-2參數(shù)規(guī)則選項(xiàng)一覽表類型type參數(shù)名稱name是否必須require默認(rèn)值default最小值min,最大值max更多配置選項(xiàng)(無(wú)特殊說(shuō)明,均為可選)字符串stringTRUE/FALSE,默認(rèn)FALSE應(yīng)為字符串可選regex選項(xiàng)用于配置正則匹配的規(guī)則;format選項(xiàng)用于定義字符編碼的類型,如utf8、gbk、gb2312等整數(shù)intTRUE/FALSE,默認(rèn)FALSE應(yīng)為整數(shù)可選浮點(diǎn)數(shù)floatTRUE/FALSE,默認(rèn)FALSE應(yīng)為浮點(diǎn)數(shù)可選布爾值booleanTRUE/FALSE,默認(rèn)FALSEtrue/false以下值會(huì)轉(zhuǎn)換為TRUE:ok,true,success,on,yes,1,以及其他PHP作為TRUE的值時(shí)間戳/日期dateTRUE/FALSE,默認(rèn)FALSE日期字符串可選,僅當(dāng)為format配置為timestamp時(shí)才判斷,且最值應(yīng)為時(shí)間戳format選項(xiàng)用于配置格式,為timestamp時(shí)會(huì)將字符串的日期轉(zhuǎn)換為時(shí)間戳數(shù)組arrayTRUE/FALSE,默認(rèn)FALSE字符串或者數(shù)組,為非數(shù)組會(huì)自動(dòng)轉(zhuǎn)換/解析成數(shù)組可選,判斷數(shù)組元素個(gè)數(shù)format選項(xiàng)用于配置數(shù)組和格式,為explode時(shí)根據(jù)separator選項(xiàng)將字符串分割成數(shù)組,為json時(shí)進(jìn)行JSON解析枚舉enumTRUE/FALSE,默認(rèn)FALSE應(yīng)為range選項(xiàng)中的某個(gè)元素必須的range選項(xiàng),為一數(shù)組,用于指定枚舉的集合文件fileTRUE/FALSE,默認(rèn)FALSE數(shù)組類型可選,用于表示文件大小范圍,單位為Brange選項(xiàng)用于指定可允許上傳的文件類型;ext選項(xiàng)用于表示需要過(guò)濾的文件擴(kuò)展名回調(diào)callable/callbackTRUE/FALSE,默認(rèn)FALSEcallable/callback選項(xiàng)用于設(shè)置回調(diào)函數(shù),params選項(xiàng)為回調(diào)函數(shù)的第三個(gè)參數(shù)(另外第一個(gè)為參數(shù)值,第二個(gè)為所配置的規(guī)則)公共配置選項(xiàng)公共的配置選項(xiàng),除了上面的類型、參數(shù)名稱、是否必須、默認(rèn)值,還有說(shuō)明描述、數(shù)據(jù)來(lái)源。下面分別簡(jiǎn)單說(shuō)明。類型type

用于指定參數(shù)的類型,可以是string、int、float、boolean、date、array、enum、file、callable,或者自定義的類型。未指定時(shí),默認(rèn)為字符串。參數(shù)名稱name

接口參數(shù)名稱,即客戶端需要傳遞的參數(shù)名稱。與PHP變量規(guī)則一樣,以下劃線或字母開(kāi)頭。此選項(xiàng)必須提供,否則會(huì)提示錯(cuò)誤。是否必須require

為TRUE時(shí),表示此參數(shù)為必須值;為FALSE時(shí),表示此參數(shù)為可選。未指定時(shí),默認(rèn)為FALSE。默認(rèn)值default

未提供接口參數(shù)時(shí)的默認(rèn)值。未指定時(shí),默認(rèn)為NULL。最小值min,最大值max

部分類型適用。用于指定接口參數(shù)的范圍,比較時(shí)采用的是閉區(qū)間,即范圍應(yīng)該為:[min,max]。也可以只使用min或max,若只配置了min,則表示:[min,+∞);若只配置了maz,則表示:(-∞,max]。說(shuō)明描述desc

用于自動(dòng)生成在線接口詳情文檔,對(duì)參數(shù)的含義和要求進(jìn)行扼要說(shuō)明。未指定時(shí),默認(rèn)為空字符串。數(shù)據(jù)來(lái)源source

指定當(dāng)前單個(gè)參數(shù)的數(shù)據(jù)來(lái)源,可以是post、get、cookie、server、request、header、或其他自定義來(lái)源。未指定時(shí),默認(rèn)為統(tǒng)一數(shù)據(jù)源。目前支持的source與對(duì)應(yīng)的數(shù)據(jù)源映射關(guān)系如下:表2-3source與對(duì)應(yīng)的數(shù)據(jù)源映射關(guān)系source對(duì)應(yīng)的數(shù)據(jù)源post$_POSTget$_GETcookie$_COOKIEserver$_SERVERrequest$_REQUESTheader$_SERVER['HTTP_X']通過(guò)source參數(shù)可以輕松、更自由獲取不同來(lái)源的參數(shù)。以下是一些常用的配置示例。//獲取HTTP請(qǐng)求方法,判斷是POST還是GET

'method'=>array('name'=>'REQUEST_METHOD','source'=>'server'),

//獲取COOKIE中的標(biāo)識(shí)

'is_new_user'=>array('name'=>'is_new_user','source'=>'cookie'),

//獲取HTTP頭部中的編碼,判斷是否為utf-8

'charset'=>array('name'=>'Accept-Charset','source'=>'header'),

若配置的source為無(wú)效或非法時(shí),則會(huì)拋出異常。如配置了'source'=>'NOT_FOUND',會(huì)得到:"msg":"服務(wù)器運(yùn)行錯(cuò)誤:參數(shù)規(guī)則中未知的數(shù)據(jù)源:NOT_FOUND"

9種參數(shù)類型對(duì)于各種參數(shù)類型,結(jié)合示例說(shuō)明如下。字符串string當(dāng)一個(gè)參數(shù)規(guī)則未指定類型時(shí),默認(rèn)為string。如最簡(jiǎn)單的:array('name'=>'username')

溫馨提示:這一小節(jié)的參數(shù)規(guī)則配置示例,都省略了類屬性,以關(guān)注配置本身的內(nèi)容。這樣就配置了一個(gè)參數(shù)規(guī)則,接口參數(shù)名字叫username,類型為字符串。一個(gè)完整的寫法可以為:array('name'=>'username','type'=>'string','require'=>true,'default'=>'nobody','min'=>1,'max'=>10)

這里指定了為必選參數(shù),默認(rèn)值為nobody,且最小長(zhǎng)度為1個(gè)字符,最大長(zhǎng)度為10個(gè)字符,若傳遞的參數(shù)長(zhǎng)度過(guò)長(zhǎng),如&username=alonglonglonglongname,則會(huì)異常失敗返回:"msg":"非法請(qǐng)求:username.len應(yīng)該小于等于10,但現(xiàn)在username.len=21"

當(dāng)需要驗(yàn)證的是中文的話,由于一個(gè)中文字符會(huì)占用3個(gè)字節(jié)。所以在min和max驗(yàn)證的時(shí)候會(huì)出現(xiàn)一些問(wèn)題。為此,PhalApi提供了format配置選項(xiàng),用于指定字符集。如:array('name'=>'username','type'=>'string','format'=>'utf8','min'=>1,'max'=>10)

我們還可以使用regex下標(biāo)來(lái)進(jìn)行正則表達(dá)式的驗(yàn)證,一個(gè)郵箱的例子是:array('name'=>'email','regex'=>"/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i")

整型int整型即自然數(shù),包括正數(shù)、0和負(fù)數(shù)。如通常數(shù)據(jù)庫(kù)中的id,即可配置成:array('name'=>'id','type'=>'int','require'=>true,'min'=>1)

當(dāng)傳遞的參數(shù),不在其配置的范圍內(nèi)時(shí),如&id=0,則會(huì)異常失敗返回:"msg":"非法請(qǐng)求:id應(yīng)該大于或等于1,但現(xiàn)在id=0"

另外,對(duì)于常見(jiàn)的分頁(yè)參數(shù),可以這樣配置:array('name'=>'page_num','type'=>'int','min'=>1,'max'=>20,'default'=>20)

即每頁(yè)數(shù)量最小1個(gè),最大20個(gè),默認(rèn)20個(gè)。浮點(diǎn)float浮點(diǎn)型,類似整型的配置,此處略。布爾值boolean布爾值,主要是可以對(duì)一些字符串轉(zhuǎn)換成布爾值,如ok,true,success,on,yes,以及會(huì)被PHP解析成true的字符串,都會(huì)轉(zhuǎn)換成TRUE。如通常的“是否記住我”參數(shù),可配置成:array('name'=>'is_remember_me','type'=>'boolean','default'=>TRUE)

則以下參數(shù),最終服務(wù)端會(huì)作為TRUE接收。?is_remember_me=ok

?is_remember_me=true

?is_remember_me=success

?is_remember_me=on

?is_remember_me=yes

?is_remember_me=1

日期date日期可以按自己約定的格式傳遞,默認(rèn)是作為字符串,此時(shí)不支持范圍檢測(cè)。例如配置注冊(cè)時(shí)間:array('name'=>'register_date','type'=>'date')

對(duì)應(yīng)地,register_date=2015-01-3110:00:00則會(huì)被獲取到為:"2015-01-3110:00:00"。當(dāng)需要將字符串的日期轉(zhuǎn)換成時(shí)間戳?xí)r,可追加配置選項(xiàng)'format'=>'timestamp',則配置成:array('name'=>'register_date','type'=>'date','format'=>'timestamp')

則上面的參數(shù)再請(qǐng)求時(shí),則會(huì)被轉(zhuǎn)換成:1422669600。此時(shí)作為時(shí)間戳,還可以添加范圍檢測(cè),如限制時(shí)間范圍在31號(hào)當(dāng)天:array('name'=>'register_date','type'=>'date','format'=>'timestamp','min'=>1422633600,'max'=>1422719999)

當(dāng)配置的最小值或最大值為字符串的日期時(shí),會(huì)自動(dòng)先轉(zhuǎn)換成時(shí)間戳再進(jìn)行檢測(cè)比較。如可以配置成:array('name'=>'register_date',......'min'=>'2015-01-3100:00:00','max'=>'2015-01-3123:59:59')

數(shù)組array很多時(shí)候在接口進(jìn)行批量獲取時(shí),都需要提供一組參數(shù),如多個(gè)ID,多個(gè)選項(xiàng)。這時(shí)可以使用數(shù)組來(lái)進(jìn)行配置。如:array('name'=>'uids','type'=>'array','format'=>'explode','separator'=>',')

這時(shí)接口參數(shù)&uids=1,2,3則會(huì)被轉(zhuǎn)換成:array(0=>'1',1=>'2',2=>'3',)

如果設(shè)置了默認(rèn)值,那么默認(rèn)值會(huì)從字符串,根據(jù)相應(yīng)的format格式進(jìn)行自動(dòng)轉(zhuǎn)換。如:array(......'default'=>'4,5,6')

那么在未傳參數(shù)的情況下,自動(dòng)會(huì)得到:array(0=>'4',1=>'5',2=>'6',)

又如接口需要使用JSON來(lái)傳遞整塊參數(shù)時(shí),可以這樣配置:array('name'=>'params','type'=>'array','format'=>'json')

對(duì)應(yīng)地,接口參數(shù)¶ms={"username":"test","password":"123456"}則會(huì)被轉(zhuǎn)換成:array('username'=>'test','password'=>'123456',)

溫馨提示:使用JSON傳遞參數(shù)時(shí),建議使用POST方式傳遞。若使用GET方式,須注意參數(shù)長(zhǎng)度不應(yīng)超過(guò)瀏覽器最大限制長(zhǎng)度,以及URL編碼問(wèn)。若使用JSON格式時(shí),設(shè)置了默認(rèn)值為:array(......'default'=>'{"username":"dogstar","password":"xxxxxx"}')

那么在未傳參數(shù)的情況下,會(huì)得到轉(zhuǎn)換后的:array('username'=>'dogstar','password'=>'xxxxxx',)

特別地,當(dāng)配置成了數(shù)組卻未指定格式format時(shí),接口參數(shù)會(huì)轉(zhuǎn)換成只有一個(gè)元素的數(shù)組,如接口參數(shù):&name=test,會(huì)轉(zhuǎn)換成:array(0=>'test')

枚舉enum在需要對(duì)接口參數(shù)進(jìn)行范圍限制時(shí),可以使用此枚舉型。如對(duì)于性別的參數(shù),可以這樣配置:array('name'=>'sex','type'=>'enum','range'=>array('female','male'))

當(dāng)傳遞的參數(shù)不合法時(shí),如&sex=unknow,則會(huì)被攔截,返回失敗:"msg":"非法請(qǐng)求:參數(shù)sex應(yīng)該為:female/male,但現(xiàn)在sex=unknow"

關(guān)于枚舉類型的配置,這里需要特別注意配置時(shí),應(yīng)盡量使用字符串的值。因?yàn)橥ǔ6?,接口通過(guò)GET/POST方式獲取到的參數(shù)都是字符串的,而如果配置規(guī)則時(shí)指定范圍用了整型,會(huì)導(dǎo)致底層規(guī)則驗(yàn)證時(shí)誤判。例如接口參數(shù)為&type=N,而接口參數(shù)規(guī)則為:array('name'=>'type','type'=>'enum','range'=>array(0,1,2))

則會(huì)出現(xiàn)以下這樣的誤判:var_dump(in_array('N',array(0,1,2)));//結(jié)果為true,因?yàn)?N'==0

為了避免這類情況發(fā)生,應(yīng)該使用使用字符串配置范圍值,即可這樣配置:array('name'=>'type','type'=>'enum','range'=>array(`0`,`1`,`2`))

文件file在需要對(duì)上傳的文件進(jìn)行過(guò)濾、接收和處理時(shí),可以使用文件類型,如:array(

'name'=>'upfile',

'type'=>'file',

'min'=>0,

'max'=>1024*1024,

'range'=>array('image/jpeg','image/png'),

'ext'=>array('jpeg','png')

)

其中,min和max分別對(duì)應(yīng)文件大小的范圍,單位為字節(jié);range為允許的文件類型,使用數(shù)組配置,且不區(qū)分大小寫。如果成功,返回的值對(duì)應(yīng)的是$_FILES["upfile"],即會(huì)返回:array(

'name'=>...,//被上傳文件的名稱

'type'=>...,//被上傳文件的類型

'size'=>...,//被上傳文件的大小,以字節(jié)計(jì)

'tmp_name'=>...,//存儲(chǔ)在服務(wù)器的文件的臨時(shí)副本的名稱

)

對(duì)應(yīng)的是:$_FILES["upfile"]["name"]-被上傳文件的名稱$_FILES["upfile"]["type"]-被上傳文件的類型$_FILES["upfile"]["size"]-被上傳文件的大小,以字節(jié)計(jì)$_FILES["upfile"]["tmp_name"]-存儲(chǔ)在服務(wù)器的文件的臨時(shí)副本的名稱$_FILES["upfile"]["error"]-由文件上傳導(dǎo)致的錯(cuò)誤代碼參考:以上內(nèi)容來(lái)自W3School,文件上傳時(shí)請(qǐng)使用表單上傳,并enctype屬性使用"multipart/form-data"。更多請(qǐng)參考\hPHP文件上傳。若需要配置默認(rèn)值default選項(xiàng),則也應(yīng)為一數(shù)組,且其格式應(yīng)類似如上。其中,ext是對(duì)文件后綴名進(jìn)行驗(yàn)證,當(dāng)如果上傳文件后綴名不匹配時(shí)將拋出異常。文件擴(kuò)展名的過(guò)濾可以類似這樣進(jìn)行配置:?jiǎn)蝹€(gè)后綴名-數(shù)組形式'ext'=>array('jpg')

單個(gè)后綴名-字符串形式'ext'=>'jpg'

多個(gè)后綴名-數(shù)組形式'ext'=>array('jpg','jpeg','png','bmp')

多個(gè)后綴名-字符串形式(以英文逗號(hào)分割)'ext'=>'jpg,jpeg,png,bmp'

回調(diào)callable/callback當(dāng)需要利用已有函數(shù)進(jìn)行自定義驗(yàn)證時(shí),可采用回調(diào)參數(shù)規(guī)則,如配置規(guī)則:array('name'=>'version','type'=>'callable','callback'=>'Common_Request_Version::formatVersion')

然后,回調(diào)時(shí)將調(diào)用下面這個(gè)新增的類函數(shù)://$vim./Shop/Common/Request/Version.php

<?php

classCommon_Request_Version{

publicstaticfunctionformatVersion($value,$rule){

if(count(explode('.',$value))<3){

thrownewPhalApi_Exception_BadRequest('版本號(hào)格式錯(cuò)誤');

}

return$value;

}

}

溫馨提示:回調(diào)函數(shù)的簽名為:functionformat($value,$rule,$params),第一個(gè)為參數(shù)原始值,第二個(gè)為所配置的規(guī)則,第三個(gè)可選參數(shù)為配置規(guī)則中的params選項(xiàng)。最后應(yīng)返回轉(zhuǎn)換后的參數(shù)值。還記得我們前面剛學(xué)的三級(jí)參數(shù)規(guī)則嗎?雖然在應(yīng)用參數(shù)配置中已配置公共version參數(shù)規(guī)則,但我們可以在具體的接口類中重新配置這個(gè)規(guī)則。把在HelloWorld接口中把這個(gè)版本參數(shù)類型修改成此自定義回調(diào)類型。即://$vim./Shop/Api/Welcome.php

classApi_WelcomeextendsPhalApi_Api{

publicfunctiongetRules(){

returnarray(

'say'=>array(

'version'=>array('name'=>'version','type'=>'callable','callback'=>'Common_Request_Version::formatVersion'),

)

);

}

......

修改好后,便可使用此自定義的回調(diào)處理了。當(dāng)正常傳遞合法version參數(shù),如請(qǐng)求/shop/welcome/say?version=1.2.3,可以正常響應(yīng)。若故意傳遞非法的version參數(shù),如請(qǐng)求/shop/welcome/say?version=123,則會(huì)提示這樣的錯(cuò)誤:"msg":"非法請(qǐng)求:版本號(hào)格式錯(cuò)誤"

由于自PHP5.4起可用callable類型指定回調(diào)類型callback。所以,為了減輕記憶的負(fù)擔(dān),這里使用callable或者callback來(lái)表示類型都可以,即可以配置成:'type'=>'callable',,也可以配置成:'type'=>'callback',?;卣{(diào)函數(shù)的選項(xiàng)也一樣。以下是來(lái)自PHP官網(wǎng)的一些回調(diào)函數(shù)的示例://Type1:Simplecallback

call_user_func('my_callback_function');

//Type2:Staticclassmethodcall

call_user_func(array('MyClass','myCallbackMethod'));

//Type3:Objectmethodcall

$obj=newMyClass();

call_user_func(array($obj,'myCallbackMethod'));

//Type4:Staticclassmethodcall(AsofPHP5.2.3)

call_user_func('MyClass::myCallbackMethod');

參考:更多請(qǐng)參考\hCallback/Callable類型。所以上面的callback也可以配置成:'callback'=>array('Common_Request_Version','formatVersion')

2.2.3過(guò)濾器與簽名驗(yàn)證如何開(kāi)啟過(guò)濾器進(jìn)行簽名驗(yàn)證?當(dāng)需要開(kāi)啟過(guò)濾器,只需要注冊(cè)DI()->filter即可。在初始化文件init.php中去掉以下注釋便可啟用默認(rèn)的簽名驗(yàn)證服務(wù)。//$vim./Public/init.php

//簽名驗(yàn)證服務(wù)

DI()->filter='PhalApi_Filter_SimpleMD5';

這里的過(guò)濾器是指PhalApi在具體接口服務(wù)前所執(zhí)行的過(guò)程,主要用于簽名驗(yàn)證或?qū)崿F(xiàn)其他預(yù)加載處理的功能。默認(rèn)的簽名方案PhalApi提供了一個(gè)默認(rèn)簽名驗(yàn)證方案,主要是基于md5的簽名生成。這個(gè)只是作為一般性的參考,在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們應(yīng)該

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論