自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

1.4.3 應(yīng)用(前端控制器)(1)

云計(jì)算
《Yii框架深度剖析》第1章初識(shí)PHP框架技術(shù),本章首先介紹PHP語(yǔ)言發(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é)為大家介紹應(yīng)用(前端控制器)。

1.4.3 應(yīng)用(前端控制器)(1)

1.4.2節(jié)中對(duì)原有的MVC模式進(jìn)行了改進(jìn),在入口文件中實(shí)現(xiàn)了URL的解析。用戶的每一次請(qǐng)求都指向服務(wù)器的***可訪問(wèn)文件。經(jīng)過(guò)解析URL,最終轉(zhuǎn)向所要訪問(wèn)的控制器。但是當(dāng)系統(tǒng)日趨復(fù)雜和多樣時(shí),如URL參數(shù)和POST數(shù)據(jù)需要進(jìn)行必要的檢查和特殊字符過(guò)濾、記錄日志、訪問(wèn)統(tǒng)計(jì)等,如果各種可以集中處理的任務(wù)都放在入口文件執(zhí)行,那么將會(huì)出現(xiàn)代碼重復(fù)、業(yè)務(wù)邏輯混亂且分散的情況。因此,為了降低系統(tǒng)代碼邏輯的復(fù)雜度,進(jìn)一步集中控制系統(tǒng),并提高系統(tǒng)的安全控制能力,以及可維護(hù)性、可重用性和可伸縮性,本節(jié)中對(duì)原有的MVC模式進(jìn)行了改進(jìn),提出了應(yīng)用(前端控制器)的概念,實(shí)現(xiàn)MVC在復(fù)雜系統(tǒng)中的前端控制器開(kāi)發(fā)模式優(yōu)化策略。

1.在應(yīng)用中實(shí)現(xiàn)URL解析

采用前端控制器模式,提供一個(gè)處理不同請(qǐng)求的中心,處理工作包括安全事務(wù)、視圖選擇、異常處理和響應(yīng)內(nèi)容的生成,通過(guò)將這些處理工作集中在一點(diǎn)進(jìn)行,大大降低了PHP代碼量,同時(shí)也減少了視圖層的程序邏輯,保證了在不同請(qǐng)求之間可以大量地重用邏輯代碼。

應(yīng)用(前端控制器)的URL解析功能在文件framework/Cweb- Application.php文件中實(shí)現(xiàn),流程圖如圖1-9所示。解析URL代碼如下。
 

 

  1. php 
  2. class CWebApplication {  
  3. public $name;  
  4. //默認(rèn)控制器是SiteController  
  5. public $defaultController="site";  
  6. //默認(rèn)動(dòng)作是actionIndex  
  7. public $defaultAction="index";  
  8. //執(zhí)行應(yīng)用  
  9. public function run()  
  10. {  
  11. //如URL 為http://hostname/index.php?r=controllerid/actionid  
  12. //得到controllerid/actionid  
  13. if(!empty($_GET['r']))  
  14. {  
  15. $route=$_GET['r'];  
  16. //得到controllerid 賦值給成員變量  
  17. $pos=strpos($route,'/');  
  18. $this->defaultController=substr($route,0,$pos);  
  19. $this->defaultController=strtolower($this->defaultController);  
  20. //得到actionid 賦值給成員變量  
  21. $this->defaultAction=(string)substr($route,$pos+1);  
  22. }  
  23. //得到控制器類(lèi)名  
  24. $className=ucfirst($this->defaultController).'Controller';  
  25. //獲得控制器文件路徑  
  26. $classFile="./protected/controllers/".$className.'.php';  
  27. //最后一步操作:該類(lèi)文件存在及該類(lèi)存在,則導(dǎo)入并調(diào)用acion 方法  
  28. if(is_file($classFile))  
  29. {  
  30. if(!class_exists($className,false))  
  31. {  
  32. require($classFile);  
  33. $classnew $className();  
  34. $functionName="action".ucfirst($this->defaultAction);  
  35. $class->$functionName();  
  36. }  
  37. }  
  38. }  

2.單例模式創(chuàng)建應(yīng)用(前端控制器設(shè)計(jì)模式)

對(duì)于系統(tǒng)中的某些類(lèi)來(lái)說(shuō),只有一個(gè)實(shí)例很重要。例如,一個(gè)系統(tǒng)中可以存在多個(gè)打印任務(wù),但是只能有一個(gè)正在工作的任務(wù);一個(gè)系統(tǒng)只能有一個(gè)窗口管理器或文件系統(tǒng);一個(gè)系統(tǒng)只能有一個(gè)計(jì)時(shí)工具或ID(序號(hào))生成器。例如,在Windows中就只能打開(kāi)一個(gè)任務(wù)管理器。如果不使用機(jī)制對(duì)窗口對(duì)象進(jìn)行***化,將彈出多個(gè)窗口,如果這些窗口顯示的內(nèi)容完全一致,則是重復(fù)對(duì)象,浪費(fèi)內(nèi)存資源;如果這些窗口顯示的內(nèi)容不一致,則意味著在某一瞬間系統(tǒng)有多個(gè)狀態(tài),與實(shí)際不符,也會(huì)給用戶帶來(lái)誤解,不知道哪一個(gè)才是真實(shí)的狀態(tài)。因此,確保系統(tǒng)中某個(gè)對(duì)象的***性(即一個(gè)類(lèi)只能有一個(gè)實(shí)例)是非常重要的。

我們希望系統(tǒng)中的應(yīng)用(前端控制器)只有一個(gè)實(shí)例對(duì)象而且該實(shí)例對(duì)象易于外界訪問(wèn),從而方便應(yīng)用實(shí)例對(duì)象個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源,單例模式是最好的解決方案之一。

單例模式是一種常用的軟件設(shè)計(jì)模式。其要點(diǎn)有3個(gè):一是類(lèi)只能有一個(gè)實(shí)例,二是它必須自行創(chuàng)建這個(gè)實(shí)例,三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。

從具體實(shí)現(xiàn)角度來(lái)說(shuō),就是以下3點(diǎn):一是單例模式的類(lèi)只提供私有的構(gòu)造方法,二是類(lèi)定義中含有一個(gè)該類(lèi)的靜態(tài)私有對(duì)象,三是該類(lèi)提供靜態(tài)的公有方法用于創(chuàng)建或獲取它本身的靜態(tài)私有對(duì)象。在framework/CWebApplication.php文件中添加下面所示的部分代碼。
 

  1. php 
  2. class CWebApplication {  
  3. ……  
  4. //定義類(lèi)的靜態(tài)私有對(duì)象  
  5. private static $_app;  
  6. //構(gòu)造方法在實(shí)例對(duì)象被創(chuàng)建時(shí)自動(dòng)執(zhí)行  
  7. private function __construct($config=null)  
  8. {  
  9. //獲取配置文件中的數(shù)組  
  10. }  
  11. //靜態(tài)的公有方法用于創(chuàng)建它本身的靜態(tài)私有對(duì)象  
  12. public static function createApplication($config=null)  
  13. {  
  14. if(self::$_app===null)  
  15. self::$_app = new CApplication($config);  
  16. return self::$_app;  
  17. }  
  18. //靜態(tài)的公有方法用于獲取它本身的靜態(tài)私有對(duì)象  
  19. public static function app()  
  20. {  
  21. return self::$_app;  
  22. }  
  23. //執(zhí)行應(yīng)用  
  24. public function run(){……}  

3.應(yīng)用的配置文件

默認(rèn)情況下,應(yīng)用是一個(gè)CWebApplication的實(shí)例。要自定義它,通常需要提供一個(gè)配置文件以在創(chuàng)建應(yīng)用實(shí)例時(shí)初始化其屬性值。這就好比去組裝計(jì)算機(jī),客戶拿來(lái)具體的配置單,按照要求就可以組裝符合要求的計(jì)算機(jī)。而CWebApplication就是組裝工人,配置單就是下面要說(shuō)明的配置文件。

配置信息在配置文件中以數(shù)組元素的方式存放,一個(gè)元素就是兩個(gè)字符串組成的鍵值對(duì),一個(gè)字符串是鍵(key),另一個(gè)字符串是這個(gè)鍵的對(duì)應(yīng)的值(value)。大多數(shù)的系統(tǒng)都有一些配置常量,將這些常量放在配置文件中,系統(tǒng)通過(guò)訪問(wèn)這個(gè)配置文件取得配置常量,就可以通過(guò)修改配置文件而無(wú)須修改程序達(dá)到更改系統(tǒng)配置的目的。系統(tǒng)也可以在配置文件中存儲(chǔ)一些工作環(huán)境信息,這樣在系統(tǒng)每次訪問(wèn)時(shí),這些信息可以運(yùn)行在每一個(gè)應(yīng)用的生命周期中。

通常在一個(gè)單獨(dú)的PHP 腳本(protected/config/main.php)中保存這些配置。在腳本中,通過(guò)以下方式返回此配置數(shù)組。
 

  1. php 
  2. return array(  
  3. //默認(rèn)控制器  
  4. "defaultController"=>"default",  
  5. //通過(guò)應(yīng)用全局訪問(wèn)方法Yii::app()->name;直接訪問(wèn)。  
  6. "name"=>"my application",  
  7. );  
  8. ?> 

 在應(yīng)用的構(gòu)造方法中添加對(duì)配置文件操作的代碼:
 

  1. php 
  2. class CWebApplication {  
  3. ……  
  4. //構(gòu)造方法在實(shí)例對(duì)象被創(chuàng)建時(shí)自動(dòng)執(zhí)行  
  5. private function __construct($config=null)  
  6. {  
  7. //獲取配置文件中的數(shù)組  
  8. if(is_string($config))  
  9. $config=require($config);  
  10. /*  
  11. 把配置文件中數(shù)組定義的元素賦值給CWebApplication 類(lèi)中相同成員屬性  
  12. array(  
  13. "name"=>"my application",  
  14. "defaultController"=>"default",  
  15. );  
  16. */  
  17. if(is_array($config))  
  18. {  
  19. /*  
  20. 第一次循環(huán):$this->name=“my application”;  
  21. 第二次循環(huán):$this->defaultController=“default”;  
  22. */  
  23. foreach($config as $key=>$value)  
  24. $this->$key=$value;  
  25. }  
  26. }  
  27. ……  

 

喜歡的朋友可以添加我們的微信賬號(hào):

51CTO讀書(shū)頻道二維碼


51CTO讀書(shū)頻道活動(dòng)討論群:365934973

責(zé)任編輯:book 來(lái)源: 人民郵電出版社
相關(guān)推薦

2013-06-08 09:50:30

SDN控制器應(yīng)用OpenFlow軟件定義網(wǎng)絡(luò)

2023-11-19 18:46:04

智能控制器芯片

2011-07-14 10:28:54

額外域控制器

2020-03-24 10:54:36

ADC負(fù)載均衡

2015-08-07 15:28:46

選取城市控制器源碼

2023-08-13 18:31:45

SDN控制器

2013-12-02 17:33:52

Radware

2011-07-12 09:29:10

主域控制器備份域控制器

2015-02-02 09:37:42

SDN控制器

2024-09-27 16:28:07

2011-03-17 21:48:22

云計(jì)算ArrayAPVx600

2013-11-13 14:05:33

Riverbed應(yīng)用交付Gartner

2011-03-17 15:47:26

ArrayAPVx600

2012-08-14 09:44:03

2009-01-12 11:16:58

控制器控制器行為行為結(jié)果

2013-12-19 09:32:01

SDN南向網(wǎng)絡(luò)控制

2011-07-12 09:58:42

主域控制器備份域控制器

2022-02-10 16:43:35

汽車(chē)智能芯片

2011-07-07 17:15:52

2021-11-25 14:44:51

Kubernetes復(fù)制控制器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)