新聞中心
1.4.2 入口文件(1)
作者:劉琨 2017-11-23 17:23:23
云計(jì)算 《Yii框架深度剖析》第1章初識(shí)PHP框架技術(shù),本章首先介紹PHP語言發(fā)展歷史及其適合的應(yīng)用領(lǐng)域,然后講解PHP框架技術(shù)的概念并仿照Yii框架源碼自定義一個(gè)框架,其中包括MVC框架模式、單入口模式和應(yīng)用(前端控制器模式)的實(shí)現(xiàn)。讀者在充分了解了這部分內(nèi)容后,將正式進(jìn)入到Y(jié)ii框架的學(xué)習(xí)。本節(jié)為大家介紹入口文件。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供工布江達(dá)網(wǎng)站建設(shè)、工布江達(dá)做網(wǎng)站、工布江達(dá)網(wǎng)站設(shè)計(jì)、工布江達(dá)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、工布江達(dá)企業(yè)網(wǎng)站模板建站服務(wù),十年工布江達(dá)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
1.4.2 入口文件(1)
本節(jié)首先介紹系統(tǒng)多個(gè)請(qǐng)求入口設(shè)計(jì)帶來的不便,然后介紹單一請(qǐng)求入口設(shè)計(jì)模式實(shí)現(xiàn)原理。本節(jié)的學(xué)習(xí)目標(biāo)是明確單一入口文件設(shè)計(jì)模式的優(yōu)點(diǎn),避免在以后的開發(fā)項(xiàng)目中出現(xiàn)多入口。
1.入口文件設(shè)計(jì)
系統(tǒng)中凡是能夠被訪問的PHP文件稱為入口文件。如果用戶的不同請(qǐng)求直接對(duì)應(yīng)到Web服務(wù)器中的不同PHP文件,即系統(tǒng)是多入口設(shè)計(jì)。在剛開始學(xué)習(xí)PHP的時(shí)候,通常一個(gè)項(xiàng)目都會(huì)這樣做:
index.php ——網(wǎng)站首頁
list.php?page=5 ——內(nèi)容列表頁
info.php?id=12 ——內(nèi)容詳細(xì)頁
login.php ——用戶登錄頁
又或者在1.4.1節(jié)實(shí)現(xiàn)MVC框架模式后,訪問不同的控制器類文件,如DefaultController. php或SiteController.php。
對(duì)于這些項(xiàng)目來說,都有多個(gè)入口文件,隨著項(xiàng)目規(guī)模的不斷擴(kuò)大,多入口的設(shè)計(jì)缺陷會(huì)越來越明顯,如系統(tǒng)目錄結(jié)構(gòu)混亂,后期維護(hù)困難,容易暴露程序漏洞,不便于系統(tǒng)的統(tǒng)一管理等。為了避免多入口設(shè)計(jì)帶來的諸多問題,可以使用單一入口設(shè)計(jì)模式。單一入口設(shè)計(jì)模式就是一個(gè)文件處理所有的HTTP請(qǐng)求,也就是說,訪問任何控制器文件,無論是DefaultController.php、SiteController. php,還是其他控制器類文件。每一次請(qǐng)求都是指向服務(wù)器的同一個(gè)文件,如入口文件index.php,該文件負(fù)責(zé)URL解析,最終轉(zhuǎn)向所要訪問的頁面,如圖1-6所示。
PHP單一入口模式可謂是現(xiàn)在一種比較流行的大型Web應(yīng)用開發(fā)模式。當(dāng)前比較流行的一些PHP開發(fā)框架,如Zend、ThinkPHP和Yii等都是采用單一入口模式。
使用單一入口文件模式的優(yōu)點(diǎn)如下。
更加安全。單一入口模式給用戶提供了單一的請(qǐng)求入口,在入口文件可以對(duì)請(qǐng)求進(jìn)行過濾,加入安全處理代碼,而傳統(tǒng)的多請(qǐng)求入口模式需要為每個(gè)文件都加入安全處理程序塊。
模塊化程度高。開發(fā)人員只需關(guān)注自己所開發(fā)的模塊,開發(fā)人員之間不需考慮程序是否正常運(yùn)行,因?yàn)檫@一切全部交給入口文件來協(xié)調(diào)。
便于統(tǒng)一管理,定制性強(qiáng)。系統(tǒng)的所有模塊都由入口文件進(jìn)行統(tǒng)一管理,任何一個(gè)模塊可以不經(jīng)模塊本身啟用或禁用。
2.入口文件中實(shí)現(xiàn)URL的解析
在上文中提到入口文件的URL解析,即入口文件會(huì)將原始請(qǐng)求轉(zhuǎn)發(fā)給相應(yīng)的處理控制器,完成具體的業(yè)務(wù)處理。例如,有以下URL地址:
- http://
/ - http://
/index.php - http://
/index.php?r=site - http://
/index.php?r=site/index
自定義框架模仿Yii框架采用路徑(PATH)URL模式訪問規(guī)則。路徑URL模式采用目錄分層的思想,路徑格式簡(jiǎn)潔,URL解析效率高,此URL格式為:http://
我們希望上面所有URL被解析后都會(huì)訪問SiteController控制器的actionIndex()方法。URL解析執(zhí)行流程如圖1-7所示,首先訪問入口文件,在其中分析請(qǐng)求URL的參數(shù),在沒有“r”參數(shù)的情況下默認(rèn)訪問SiteController的actionIndex()方法,否則依據(jù)“r”參數(shù)訪問SiteController的actionIndex()方法,即所有的訪問由URL的參數(shù)來統(tǒng)一解析和調(diào)度。
入口文件index.php中代碼實(shí)現(xiàn)如下。
- //默認(rèn)控制器是SiteController
- $defaultController="site";
- //默認(rèn)動(dòng)作actionIndex
- $defaultAction="index";
- //如URL 為http://hostname/index.php?r=controllerid/actionid
- //得到controllerid/actionid
- if(!empty($_GET['r']))
- {
- $route=$_GET['r'];
- //得到controllerid 賦值給成員變量
- $pos=strpos($route,'/');
- $defaultController=substr($route,0,$pos);
- $defaultController=strtolower($defaultController);
- //得到actionid 賦值給成員變量
- $defaultAction=(string)substr($route,$pos+1);
- }
- //得到控制器類名
- $className=ucfirst($defaultController).'Controller';
- //獲得控制器文件路徑
- $classFile="./controllers/".$className.'.php';
- //最后一步操作:該類文件存在則導(dǎo)入,該類存在則創(chuàng)建對(duì)象并調(diào)用acion 方法
- if(is_file($classFile))
- {
- if(!class_exists($className,false))
- {
- require($classFile);
- $class= new $className();
- $functionName="action".ucfirst($defaultAction);
- $class->$functionName();
- }
- }
- ?>
由上面的程序可知,默認(rèn)的控制器是SiteController,默認(rèn)的執(zhí)行方法是actionIndex()方法??刂破鞯念惷鬃帜复髮?,以“Controller”結(jié)尾,而且控制器類文件必須保存在controllers文件夾中;動(dòng)作方法名必須以“action”為前綴,acitonID首字母大寫。從這段程序中也可以了解到代碼規(guī)范的重要性,因?yàn)槲募蝾惷榷紩?huì)在程序中使用。同樣的道理,在將要學(xué)習(xí)的Yii框架開發(fā)過程中,也要遵守一定的編碼規(guī)范。例如,命名類時(shí),使用駝峰風(fēng)格,即每個(gè)單詞的首字母大寫并連在一起,中間無空格;變量名和方法名應(yīng)該使它們的第一個(gè)單詞全部小寫,其余單詞首字母大寫,以使其區(qū)別于類名,如$basePath、runController();對(duì)私有類成員變量來說,推薦以下畫線作為其名字前綴,如$_actionList。
提示:
為了使PHP語言開發(fā)的框架能夠遵循共同的編碼風(fēng)格,在2009年由幾個(gè)框架的開發(fā)者組成了PHP-FIG(PHP Framework Interoperability Group)小組,一直擴(kuò)展到現(xiàn)在已經(jīng)擁有20多位成員。
實(shí)現(xiàn)入口文件后,框架執(zhí)行流程如圖1-8所示。
1.用戶發(fā)出了訪問URL的請(qǐng)求,Web服務(wù)器通過執(zhí)行入口文件index.php處理此請(qǐng)求。
2.入口文件負(fù)責(zé)完成URL的解析,根據(jù)URL請(qǐng)求創(chuàng)建控制器并調(diào)用動(dòng)作處理用戶請(qǐng)求。
3.控制器調(diào)用模型實(shí)例對(duì)象從數(shù)據(jù)庫中讀取數(shù)據(jù)。
4.渲染視圖。
5.視圖讀取并顯示模型的數(shù)據(jù)。
6.動(dòng)作完成視圖渲染并將其返回給用戶。
3.單一入口模式服務(wù)器環(huán)境配置
實(shí)現(xiàn)單一入口模式之后,需要確保應(yīng)用根目錄下,除入口文件外的PHP文件(所有安全敏感的PHP文件)都不允許訪問。通過實(shí)踐證明,使用Apache服務(wù)器的目錄級(jí)配置文件.htaccess文件保護(hù)目錄比使用其他方式更為有效和安全。更重要的是,使用.htaccess的方式進(jìn)行設(shè)置,不需要編寫程序就可以實(shí)現(xiàn),具體操作比較容易。
(1)目錄級(jí)配置文件.htaccess
.htaccess是一個(gè)純文本文件,其中存放著Apache服務(wù)器配置相關(guān)的一些指令,它類似于Apache的站點(diǎn)配置文件,如httpd.conf文件。.htaccess與httpd.conf配置文件不同的是,它只作用于此目錄及其所有子目錄。另外,httpd.conf是在Apache服務(wù)啟動(dòng)的時(shí)候就加載的,而.htaccess只有在用戶訪問目錄時(shí)加載,其中,修改.htaccess文件不需要重啟Apache服務(wù)器。.htaccess的功能包括設(shè)置網(wǎng)頁密碼、設(shè)置發(fā)生錯(cuò)誤時(shí)出現(xiàn)的文件、禁止讀取文件、重新定向文件等。
在需要針對(duì)目錄改變服務(wù)器的配置,而對(duì)服務(wù)器系統(tǒng)沒有root權(quán)限時(shí),應(yīng)該使用.htaccess文件。如果服務(wù)器管理員不愿意頻繁修改配置,則可以允許用戶通過.htaccess文件自己修改配置,尤其是在一臺(tái)機(jī)器上提供多個(gè)用戶站點(diǎn),而又期望用戶可以自己改變配置的情況下,一般會(huì)開放部分.htaccess的功能給使用者自行設(shè)置。
注意:
.htaccess是一個(gè)完整的文件名,不是***.htaccess或其他格式。
如何允許用戶使用.htaccess文件呢?在Apache服務(wù)器的配置文件httpd.conf中,查找服務(wù)器的根目錄的配置信息:
- ……
- AllowOverride None
- ……
喜歡的朋友可以添加我們的微信賬號(hào):
51CTO讀書頻道二維碼
51CTO讀書頻道活動(dòng)討論群:365934973
新聞標(biāo)題:1.4.2 入口文件(1)
URL地址:http://fisionsoft.com.cn/article/cospjoo.html


咨詢
建站咨詢
