什么是單一入口應用程序.doc_第1頁
什么是單一入口應用程序.doc_第2頁
什么是單一入口應用程序.doc_第3頁
什么是單一入口應用程序.doc_第4頁
什么是單一入口應用程序.doc_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

什么是單一入口應用程序?在解釋什么是單一入口應用程序之前,我們先來看看傳統的 web 應用程序。news.php 顯示新聞列表news_edit.php 顯示新聞編輯頁面這兩個頁面不但分別實現了兩個功能,還成為了應用程序的兩個入口。那什么是入口啊?打個比方,大家上 WC,都是男生進一個門,女生進一個門。這兩個門就是 WC 的兩個入口。呵呵,上面的例子應該很好理解吧。那稍微變換一下,單一入口的概念就很容易理解了。現在我們是進一個公共 WC,不管男女都是從最外面的入口進入,交了錢以后才分別進兩個門。那最外面的入口就是這個 WC 的單一入口。所以單一入口的應用程序實際上就是說用一個文件處理所有的 HTTP 請求。例如不管是新聞列表功能還是新聞編輯功能,都是從瀏覽器訪問 index.php 文件。這個 index.php 文件就是這個應用程序的單一入口。index.php 如何知道用戶是要使用哪一個功能呢?很簡單,我們訪問 index.php 時跟上一個特定的參數就行了。例如 index.php?action=news 就是顯示新聞列表,而 index.php?action=news_edit 就是新聞編輯。而在 index.php 里面,僅用兩行代碼就可以實現這種效果。上面的代碼中,第一行是從 url 中取出 action 參數。如果沒有提供 action 參數,就設置一個默認的 index 作為參數。第二行代碼就是根據 $action 參數調用不同的代碼文件,從而實現單一入口對應不同功能的效果。單一入口應用程序的入口文件很復雜?有些朋友可能以為單一入口程序的 index.php 會像面條一樣復雜,其實是誤解。例如我現在的應用程序入口文件只有下面幾行:足夠簡單了吧?當然了,在 index.php 里面寫上一長串 switch case 絕對是拙劣的實現方式。但這純粹是開發者自己的設計和實現問題,而不是單一入口應用程序這種設計思想的問題。補充說明:這里提到 switch case 并不是說用了 switch 就代表“落后”、“土氣”等。只是說在 index.php 這個入口程序里面寫上一堆 switch case 不利于程序的修改和維護,所以是一種不好的用法。單一入口應用程序的設計思想當web服務器(apache或者iis)收到一個http請求時,會解析該請求,確定要訪問哪一個文件。例如 /news.php 的解析結果就是要求web服務器解析 news.php 文件,并返回結果給瀏覽器。現在看看單一入口應用程序的 index.php 文件,就會發現 index.php 實際上根據 url 參數進行了第二次解析。完成這個解析的程序一般稱為 Dispatcher(中文的準確翻譯我也不知道),大概意思就是將不同的請求轉發到不同的處理程序進行處理。在單一入口應用程序中,index.php 和 web服務器一起構成了一個 Dispatcher,根據 http 請求和 url 參數來確定請求的處理程序。了解了 Dispatcher 的概念后,我們可以發現前面提到的兩行代碼實際上就是一個最簡單的 Dispatcher 實現:誠然,對于一個安全、健壯的應用程序,Dispatcher 肯定不是上面那么簡單。在調用實際代碼前,還會加上各種判斷、安全性檢查等。例如判斷 url 指定的功能是否可以訪問以及 url 中包含了無效的參數。看到這里,朋友們肯定會說:單一入口程序就多了就這樣一個 dispatcher ,和我直接做成 news.php、news_edit.php 等單個文件相比有什么好處啊?單一入口應用程序的優勢單一入口應用程序的所有http請求都是通過 index.php 接收并轉發到功能代碼去的,所以我們在 index.php 里面就能完成許多實際工作。這里我只拿安全性檢查為例詳細說明一下:由于所有的 http 請求都由 index.php 接收,所以可以進行集中的安全性檢查。如果不是單一入口,那么開發者就必須記得在每一個文件的開始加上安全性檢查代碼(當然,安全性檢查代碼可以寫到另一個文件中,只需要include進來就可以了)。但我想大家都是懶人,也許記性也不好,難免有忘記的時候。因此要記得在每一個文件前面都加上必要的include可不是件容易做到的事情。與安全性檢查類似。在入口里,我們還可以對url參數和post進行必要的檢查和特殊字符過濾、記錄日志、訪問統計等等各種可以集中處理的任務。“咦,搞這么多功能,不是會把 index.php 搞得很復雜嗎?”“不會的。只需要把各種功能寫到單獨的文件,然后在index.php里面include進來就可以了!”可以看出,由于這些工作都被集中到了 index.php 來完成,可以減輕我們維護其他功能代碼的難度。例如在10個文件中保持頭部的幾個include都一致可不是件讓人愉快的事情。單一入口應用程序的缺點任何事情都有兩面性,單一入口應用程序也不例外。由于所有 http 請求都是針對 index.php,所以應用程序的 url 看起來確實不那么美觀。特別是對搜索引擎來說很不友好。要解決這個問題,可以采用 url 重寫、PATHINFO 等方式。但我個人更推薦在前臺頁面不使用單一入口方式,而是保持多個文件入口。或者兩者混用。例如新聞列表采用單獨的 news.php 顯示,而用戶注冊、發表信息等則采用單一入口。因為對于網站擁有者來說,新聞列表、新聞顯示頁面才是需要搜索引擎關注的高價值目標,而用戶注冊頁面等交互性功能則根本沒有收錄的價值。有朋友提到單一入口的應用程序會有很長一串參數,那么我們分析一下下面這個 url:index.php?url=news&news_id=123&page=2&sort=title如果改為直接訪問 news.php,也只不過省掉了 url=news 這一個參數而已。所以認為單一入口的應用程序 url 太復雜是沒有道理的。如何組織單一入口應用程序的功能代碼?單一入口應用程序最大的挑戰來自于如何合理組織各個功能的處理代碼。但只要遵循一定的步驟,也可以輕松的解決掉這個難題。首先,對于應用程序的功能要做出一個合理的分解。例如后臺的新聞欄目可能包含“添加新聞”、“編輯新聞”、“刪除新聞”等多個功能。這時我們就可以將這一組邏輯上關聯的功能組合到一個功能模塊中,稱為“新聞管理”模塊。按照上面的方法整理完應用程序的功能,我們就會得到多個功能模塊,而每個模塊又是由多個功能組成。(實際上,即便不是單一入口應用程序,功能的整理也是必須的步驟。)整理完功能后,我們就需要確定如何存放各個功能的代碼。這里我推薦兩種方式:1、每個功能模塊一個子目錄,目錄里的每一個文件就是一個功能的實現代碼。這種方式的好處是每個功能的代碼都互相隔離,非常便于多人協作。缺點是每個功能之間共享代碼和數據不那么方便。例如新聞管理模塊中的所有功能都需要一個“取出新聞欄目記錄”的功能,那么采用這種多個獨立文件的組織方式,“取出新聞欄目記錄”就只能寫在另一個文件中,然后由需要該功能的文件include進去。2、每個模塊一個文件,模塊中的每個功能寫成一個函數或者一個類方法。好處不用多說了,非常便于共享代碼和數據。缺點就是如果幾個人同時改,容易發生沖突。不過借助版本控制軟件和差異比較合并工具,沖突還是很容易解決的。好了,我們的功能代碼都確定存放方式了。那么如何調用呢?index.php 如何調用功能代碼?調用首先就是要設計一個規則,然后讓 index.php 根據這個規則來搜索和調用功能代碼。就我自己來說,我總是使用 $_GETurl 來指定要調用的功能模塊,而 $_GETaction 來指定該模塊的特定功能。因此我的應用程序會使用如下的 url 地址:index.php?url=news&action=edit覺得兩個參數太多了?那可以使用 index.php?func=news.edit 這樣的 url。只需要將 news.edit 拆開為 news 和 edit 就行了。“嘿嘿,那我故意搞一個 index.php?url=news&action=xxx,看你的應用程序還能運行?”很顯然,這樣的 url 只會使得 index.php 無法找到需要的功能代碼,最后報告錯誤。但是這和你在瀏覽器中訪問 newsxxx.php 這個并不存在的文件有什么本質區別呢?相反,我還可以讓 index.php 在發現找不到需要的功能代碼時顯示一個漂亮的出錯頁面,并提供一個返回網站首頁的連接。在實際開發中,我傾向于將一些基本服務從應用程序中抽取出來,形成一個應用程序框架。這個框架通常會包含一個 Dispatcher、基本的數據庫訪問服務、模版引擎、常用的輔助功能等。由于有了一個框架,所以我可以更加讓 Dispatcher 更加靈活。例如可以對某些功能模塊應用權限檢查,而另一些則不檢查。進一步了解單一入口應用程序要深刻理解一個事物,自己嘗試一下是最好的辦法。你可以選擇自己實現一個 Dispatcher 以及相應的各種規則,或者選擇一個現有的應用程序框架。但更好的方式還是首先嘗試一下現有的框架,然后再自己嘗試實現一個類似的。這樣可以在最短的時間內獲得最多的收獲。目前絕大多數 php 應用程序框架都是單一入口的,并采用了 MVC 模式(很遺憾,由于 MVC 實在太復雜,并且和單一入口應用程序也沒有必然聯系,所以我就不贅述了。感興趣的朋友可以 google 一下相關資料)。我個人推薦下面的框架:FleaPHP/嗯,我在做廣告。因為這個框架是我做的。但我相信這個框架將是一個非常容易上手(就算不是最容易的)框架。全中文的代碼注釋、簡單的結構、精簡的代碼都是 FleaPHP 框

溫馨提示

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

評論

0/150

提交評論