中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

php如何實(shí)現(xiàn)單一入口應(yīng)用程序-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)php如何實(shí)現(xiàn)單一入口應(yīng)用程序的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)是一家專業(yè)提供洪澤企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、HTML5建站、小程序制作等業(yè)務(wù)。10年已為洪澤眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

什么是單一入口應(yīng)用程序?

在解釋什么是單一入口應(yīng)用程序之前,我們先來(lái)看看傳統(tǒng)的 web 應(yīng)用程序。
news.php 顯示新聞列表
news_edit.php 顯示新聞編輯頁(yè)面
這兩個(gè)頁(yè)面不但分別實(shí)現(xiàn)了兩個(gè)功能,還成為了應(yīng)用程序的兩個(gè)入口。

那什么是入口啊?

打個(gè)比方,大家上 WC,都是男生進(jìn)一個(gè)門(mén),女生進(jìn)一個(gè)門(mén)。這兩個(gè)門(mén)就是 WC 的兩個(gè)入口。

呵呵,上面的例子應(yīng)該很好理解吧。那稍微變換一下,單一入口的概念就很容易理解了。
現(xiàn)在我們是進(jìn)一個(gè)公共 WC,不管男女都是從最外面的入口進(jìn)入,交了錢(qián)以后才分別進(jìn)兩個(gè)門(mén)。那最外面的入口就是這個(gè) WC 的單一入口。

所以單一入口的應(yīng)用程序?qū)嶋H上就是說(shuō)用一個(gè)文件處理所有的 HTTP 請(qǐng)求。例如不管是新聞列表功能還是新聞編輯功能,都是從瀏覽器訪問(wèn) index.php 文件。這個(gè) index.php 文件就是這個(gè)應(yīng)用程序的單一入口。

index.php 如何知道用戶是要使用哪一個(gè)功能呢?

很簡(jiǎn)單,我們?cè)L問(wèn) index.php 時(shí)跟上一個(gè)特定的參數(shù)就行了。例如 index.php?action=news 就是顯示新聞列表,而 index.php?action=news_edit 就是新聞編輯。

而在 index.php 里面,僅用兩行代碼就可以實(shí)現(xiàn)這種效果。

<?php
$action = $_GET['action'] == '' ? 'index' : $_GET['action'];
include('files/' . $action . '.php');
?>

上面的代碼中,第一行是從 url 中取出 action 參數(shù)。如果沒(méi)有提供 action 參數(shù),就設(shè)置一個(gè)默認(rèn)的 'index' 作為參數(shù)。
第二行代碼就是根據(jù) $action 參數(shù)調(diào)用不同的代碼文件,從而實(shí)現(xiàn)單一入口對(duì)應(yīng)不同功能的效果。

單一入口應(yīng)用程序的入口文件很復(fù)雜?

有些朋友可能以為單一入口程序的 index.php 會(huì)像面條一樣復(fù)雜,其實(shí)是誤解。
例如我現(xiàn)在的應(yīng)用程序入口文件只有下面幾行:

<?php
define('APP', realpath('../libs/website'));
define('LANG', 'gb2312');
define('DEBUG', 1);
require('../libs/flea1/basic.php');
run();
?>

足夠簡(jiǎn)單了吧?

當(dāng)然了,在 index.php 里面寫(xiě)上一長(zhǎng)串 switch case 絕對(duì)是拙劣的實(shí)現(xiàn)方式。但這純粹是開(kāi)發(fā)者自己的設(shè)計(jì)和實(shí)現(xiàn)問(wèn)題,而不是單一入口應(yīng)用程序這種設(shè)計(jì)思想的問(wèn)題。

補(bǔ)充說(shuō)明: 這里提到 switch case 并不是說(shuō)用了 switch 就代表“落后”、“土氣”等。只是說(shuō)在 index.php 這個(gè)入口程序里面寫(xiě)上一堆 switch case 不利于程序的修改和維護(hù),所以是一種不好的用法。

單一入口應(yīng)用程序的設(shè)計(jì)思想

當(dāng)web服務(wù)器(apache或者iis)收到一個(gè)http請(qǐng)求時(shí),會(huì)解析該請(qǐng)求,確定要訪問(wèn)哪一個(gè)文件。例如 http://www.xxx.com/news.php 的解析結(jié)果就是要求web服務(wù)器解析 news.php 文件,并返回結(jié)果給瀏覽器?,F(xiàn)在看看單一入口應(yīng)用程序的 index.php 文件,就會(huì)發(fā)現(xiàn) index.php 實(shí)際上根據(jù) url 參數(shù)進(jìn)行了第二次解析。

完成這個(gè)解析的程序一般稱為 Dispatcher(中文的準(zhǔn)確翻譯我也不知道),大概意思就是將不同的請(qǐng)求轉(zhuǎn)發(fā)到不同的處理程序進(jìn)行處理。

在單一入口應(yīng)用程序中,index.php 和 web服務(wù)器一起構(gòu)成了一個(gè) Dispatcher,根據(jù) http 請(qǐng)求和 url 參數(shù)來(lái)確定請(qǐng)求的處理程序。

了解了 Dispatcher 的概念后,我們可以發(fā)現(xiàn)前面提到的兩行代碼實(shí)際上就是一個(gè)最簡(jiǎn)單的 Dispatcher 實(shí)現(xiàn):

<?php
$action = $_GET['action'] == '' ? 'index' : $_GET['action'];
include('files/' . $action . '.php');
?>

誠(chéng)然,對(duì)于一個(gè)安全、健壯的應(yīng)用程序,Dispatcher 肯定不是上面那么簡(jiǎn)單。在調(diào)用實(shí)際代碼前,還會(huì)加上各種判斷、安全性檢查等。例如判斷 url 指定的功能是否可以訪問(wèn)以及 url 中包含了無(wú)效的參數(shù)。

看到這里,朋友們肯定會(huì)說(shuō):?jiǎn)我蝗肟诔绦蚓投嗔司瓦@樣一個(gè) dispatcher ,和我直接做成 news.php、news_edit.php 等單個(gè)文件相比有什么好處啊?

單一入口應(yīng)用程序的優(yōu)勢(shì)

單一入口應(yīng)用程序的所有http請(qǐng)求都是通過(guò) index.php 接收并轉(zhuǎn)發(fā)到功能代碼去的,所以我們?cè)?index.php 里面就能完成許多實(shí)際工作。

這里我只拿安全性檢查為例詳細(xì)說(shuō)明一下:

由于所有的 http 請(qǐng)求都由 index.php 接收,所以可以進(jìn)行集中的安全性檢查。如果不是單一入口,那么開(kāi)發(fā)者就必須記得在每一個(gè)文件的開(kāi)始加上安全性檢查代碼(當(dāng)然,安全性檢查代碼可以寫(xiě)到另一個(gè)文件中,只需要include進(jìn)來(lái)就可以了)。
但我想大家都是懶人,也許記性也不好,難免有忘記的時(shí)候。因此要記得在每一個(gè)文件前面都加上必要的include可不是件容易做到的事情。

與安全性檢查類(lèi)似。在入口里,我們還可以對(duì)url參數(shù)和post進(jìn)行必要的檢查和特殊字符過(guò)濾、記錄日志、訪問(wèn)統(tǒng)計(jì)等等各種可以集中處理的任務(wù)。

“咦,搞這么多功能,不是會(huì)把 index.php 搞得很復(fù)雜嗎?”
“不會(huì)的。只需要把各種功能寫(xiě)到單獨(dú)的文件,然后在index.php里面include進(jìn)來(lái)就可以了!”

可以看出,由于這些工作都被集中到了 index.php 來(lái)完成,可以減輕我們維護(hù)其他功能代碼的難度。例如在10個(gè)文件中保持頭部的幾個(gè)include都一致可不是件讓人愉快的事情。

單一入口應(yīng)用程序的缺點(diǎn)

任何事情都有兩面性,單一入口應(yīng)用程序也不例外。由于所有 http 請(qǐng)求都是針對(duì) index.php,所以應(yīng)用程序的 url 看起來(lái)確實(shí)不那么美觀。特別是對(duì)搜索引擎來(lái)說(shuō)很不友好。

要解決這個(gè)問(wèn)題,可以采用 url 重寫(xiě)、PATHINFO 等方式。但我個(gè)人更推薦在前臺(tái)頁(yè)面不使用單一入口方式,而是保持多個(gè)文件入口。或者兩者混用。例如新聞列表采用單獨(dú)的 news.php 顯示,而用戶注冊(cè)、發(fā)表信息等則采用單一入口。因?yàn)閷?duì)于網(wǎng)站擁有者來(lái)說(shuō),新聞列表、新聞顯示頁(yè)面才是需要搜索引擎關(guān)注的高價(jià)值目標(biāo),而用戶注冊(cè)頁(yè)面等交互性功能則根本沒(méi)有收錄的價(jià)值。

有朋友提到單一入口的應(yīng)用程序會(huì)有很長(zhǎng)一串參數(shù),那么我們分析一下下面這個(gè) url:
index.php?url=news&news_id=123&page=2&sort=title
如果改為直接訪問(wèn) news.php,也只不過(guò)省掉了 url=news 這一個(gè)參數(shù)而已。

所以認(rèn)為單一入口的應(yīng)用程序 url 太復(fù)雜是沒(méi)有道理的。

如何組織單一入口應(yīng)用程序的功能代碼?

單一入口應(yīng)用程序較大的挑戰(zhàn)來(lái)自于如何合理組織各個(gè)功能的處理代碼。但只要遵循一定的步驟,也可以輕松的解決掉這個(gè)難題。

首先,對(duì)于應(yīng)用程序的功能要做出一個(gè)合理的分解。例如后臺(tái)的新聞欄目可能包含“添加新聞”、“編輯新聞”、“刪除新聞”等多個(gè)功能。這時(shí)我們就可以將這一組邏輯上關(guān)聯(lián)的功能組合到一個(gè)功能模塊中,稱為“新聞管理”模塊。
按照上面的方法整理完應(yīng)用程序的功能,我們就會(huì)得到多個(gè)功能模塊,而每個(gè)模塊又是由多個(gè)功能組成。(實(shí)際上,即便不是單一入口應(yīng)用程序,功能的整理也是必須的步驟。)

整理完功能后,我們就需要確定如何存放各個(gè)功能的代碼。這里我推薦兩種方式:

1、每個(gè)功能模塊一個(gè)子目錄,目錄里的每一個(gè)文件就是一個(gè)功能的實(shí)現(xiàn)代碼。
這種方式的好處是每個(gè)功能的代碼都互相隔離,非常便于多人協(xié)作。缺點(diǎn)是每個(gè)功能之間共享代碼和數(shù)據(jù)不那么方便。例如新聞管理模塊中的所有功能都需要一個(gè)“取出新聞欄目記錄”的功能,那么采用這種多個(gè)獨(dú)立文件的組織方式,“取出新聞欄目記錄”就只能寫(xiě)在另一個(gè)文件中,然后由需要該功能的文件include進(jìn)去。

2、每個(gè)模塊一個(gè)文件,模塊中的每個(gè)功能寫(xiě)成一個(gè)函數(shù)或者一個(gè)類(lèi)方法。
好處不用多說(shuō)了,非常便于共享代碼和數(shù)據(jù)。缺點(diǎn)就是如果幾個(gè)人同時(shí)改,容易發(fā)生沖突。不過(guò)借助版本控制軟件和差異比較合并工具,沖突還是很容易解決的。

好了,我們的功能代碼都確定存放方式了。那么如何調(diào)用呢?

index.php 如何調(diào)用功能代碼?

調(diào)用首先就是要設(shè)計(jì)一個(gè)規(guī)則,然后讓 index.php 根據(jù)這個(gè)規(guī)則來(lái)搜索和調(diào)用功能代碼。就我自己來(lái)說(shuō),我總是使用 $_GET['url'] 來(lái)指定要調(diào)用的功能模塊,而 $_GET['action'] 來(lái)指定該模塊的特定功能。因此我的應(yīng)用程序會(huì)使用如下的 url 地址:
index.php?url=news&action=edit

覺(jué)得兩個(gè)參數(shù)太多了?那可以使用 index.php?func=news.edit 這樣的 url。只需要將 news.edit 拆開(kāi)為 news 和 edit 就行了。

“嘿嘿,那我故意搞一個(gè) index.php?url=news&action=xxx,看你的應(yīng)用程序還能運(yùn)行?”
很顯然,這樣的 url 只會(huì)使得 index.php 無(wú)法找到需要的功能代碼,最后報(bào)告錯(cuò)誤。但是這和你在瀏覽器中訪問(wèn) newsxxx.php 這個(gè)并不存在的文件有什么本質(zhì)區(qū)別呢?

相反,我還可以讓 index.php 在發(fā)現(xiàn)找不到需要的功能代碼時(shí)顯示一個(gè)漂亮的出錯(cuò)頁(yè)面,并提供一個(gè)返回網(wǎng)站首頁(yè)的連接。

在實(shí)際開(kāi)發(fā)中,我傾向于將一些基本服務(wù)從應(yīng)用程序中抽取出來(lái),形成一個(gè)應(yīng)用程序框架。這個(gè)框架通常會(huì)包含一個(gè) Dispatcher、基本的數(shù)據(jù)庫(kù)訪問(wèn)服務(wù)、模版引擎、常用的輔助功能等。由于有了一個(gè)框架,所以我可以更加讓 Dispatcher 更加靈活。例如可以對(duì)某些功能模塊應(yīng)用權(quán)限檢查,而另一些則不檢查。

進(jìn)一步了解單一入口應(yīng)用程序

要深刻理解一個(gè)事物,自己嘗試一下是好的辦法。

你可以選擇自己實(shí)現(xiàn)一個(gè) Dispatcher 以及相應(yīng)的各種規(guī)則,或者選擇一個(gè)現(xiàn)有的應(yīng)用程序框架。但更好的方式還是首先嘗試一下現(xiàn)有的框架,然后再自己嘗試實(shí)現(xiàn)一個(gè)類(lèi)似的。這樣可以在短的時(shí)間內(nèi)獲得最多的收獲。

目前絕大多數(shù) php 應(yīng)用程序框架都是單一入口的,并采用了 MVC 模式(很遺憾,由于 MVC 實(shí)在太復(fù)雜,并且和單一入口應(yīng)用程序也沒(méi)有必然聯(lián)系,所以我就不贅述了。感興趣的朋友可以 google 一下相關(guān)資料)。

我個(gè)人推薦下面的框架:

FleaPHP
http://www.fleaphp.org/
嗯,我在做廣告。因?yàn)檫@個(gè)框架是我做的。但我相信這個(gè)框架將是一個(gè)非常容易上手(就算不是最容易的)框架。
全中文的代碼注釋、簡(jiǎn)單的結(jié)構(gòu)、精簡(jiǎn)的代碼都是 FleaPHP 框架的優(yōu)勢(shì)。

CakePHP
http://www.cakephp.org/
一個(gè) Ruby on Rails 的 PHP 仿制品。具有出色的功能,但顯然太過(guò)于復(fù)雜,而且缺乏中文資料是個(gè)很大的問(wèn)題。

symfony
http://www.symfony-project.com/
一個(gè)超復(fù)雜的框架,集成了 n 多東西。項(xiàng)目網(wǎng)站上提供的視頻演示看上去很不錯(cuò)。

其他
還有 Mojavi、Phing 等許多 PHP 框架,如果你精力充沛,可以去探索一下。

感謝各位的閱讀!關(guān)于“php如何實(shí)現(xiàn)單一入口應(yīng)用程序”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)頁(yè)名稱:php如何實(shí)現(xiàn)單一入口應(yīng)用程序-創(chuàng)新互聯(lián)
瀏覽路徑:http://www.rwnh.cn/article10/ccgodo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)電子商務(wù)、品牌網(wǎng)站設(shè)計(jì)品牌網(wǎng)站制作、定制開(kāi)發(fā)網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
威海市| 昌黎县| 图们市| 梁山县| 隆回县| 开化县| 即墨市| 广宗县| 尚志市| 凤凰县| 衡阳市| 赤城县| 德昌县| 常德市| 万荣县| 玛曲县| 桦甸市| 平泉县| 刚察县| 全南县| 云霄县| 光泽县| 栖霞市| 巨野县| 连云港市| 武邑县| 桂平市| 永泰县| 项城市| 辽阳市| 含山县| 武乡县| 什邡市| 山阳县| 石渠县| 凭祥市| 兴山县| 霸州市| 汝南县| 万盛区| 榆树市|