標籤:get http 檔案 com html cti
什麼是單一入口應用程式?
在解釋什麼是單一入口應用程式之前,我們先來看看傳統的 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 裡面,僅用兩行代碼就可以實現這種效果。
<?php
$action = $_GET[‘action‘] == ‘‘ ? ‘index‘ : $_GET[‘action‘];
include(‘files/‘ . $action . ‘.php‘);
?>
上面的代碼中,第一行是從 url 中取出 action 參數。如果沒有提供 action 參數,就設定一個預設的 ‘index‘ 作為參數。
第二行代碼就是根據 $action 參數調用不同的代碼檔案,從而實現單一入口對應不同功能的效果。
單一入口應用程式的入口檔案很複雜?
有些朋友可能以為單一入口程式的 index.php 會像麵條一樣複雜,其實是誤解。
例如我現在的應用程式入口檔案只有下面幾行:
<?php
define(‘APP‘, realpath(‘../libs/website‘));
define(‘LANG‘, ‘gb2312‘);
define(‘DEBUG‘, 1);
require(‘../libs/flea1/basic.php‘);
run();
?>
足夠簡單了吧?
當然了,在 index.php 裡面寫上一長串 switch case 絕對是拙劣的實現方式。但這純粹是開發人員自己的設計和實現問題,而不是單一入口應用程式這種設計思想的問題。
補充說明: 這裡提到 switch case 並不是說用了 switch 就代表“落後”、“土氣”等。只是說在 index.php 這個入口程式裡面寫上一堆 switch case 不利於程式的修改和維護,所以是一種不好的用法。
單一入口應用程式的設計思想
當web伺服器(apache或者iis)收到一個http請求時,會解析該請求,確定要訪問哪一個檔案。例如 http://www.xxx.com/news.php 的解析結果就是要求web伺服器解析 news.php 檔案,並返回結果給瀏覽器。現在看看單一入口應用程式的 index.php 檔案,就會發現 index.php 實際上根據 url 參數進行了第二次解析。
完成這個解析的程式一般稱為 Dispatcher(中文的準確翻譯我也不知道),大概意思就是將不同的請求轉寄到不同的處理常式進行處理。
在單一入口應用程式中,index.php 和 web伺服器一起構成了一個 Dispatcher,根據 http 請求和 url 參數來確定請求的處理常式。
瞭解了 Dispatcher 的概念後,我們可以發現前面提到的兩行代碼實際上就是一個最簡單的 Dispatcher 實現:
<?php
$action = $_GET[‘action‘] == ‘‘ ? ‘index‘ : $_GET[‘action‘];
include(‘files/‘ . $action . ‘.php‘);
?>
誠然,對於一個安全、健壯的應用程式,Dispatcher 肯定不是上面那麼簡單。在調用實際代碼前,還會加上各種判斷、安全性檢查等。例如判斷 url 指定的功能是否可以訪問以及 url 中包含了無效的參數。
看到這裡,朋友們肯定會說:單一入口程式就多了就這樣一個 dispatcher ,和我直接做成 news.php、news_edit.php 等單個檔案相比有什麼好處啊?
來源於:http://www.php100.com/html/webkaifa/PHP/PHP/2009/0819/3199.html