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

成都創(chuàng)新互聯(lián)主要從事網頁設計、PC網站建設(電腦版網站建設)、wap網站建設(手機版網站建設)、成都響應式網站建設公司、程序開發(fā)、網站優(yōu)化、微網站、微信小程序等,憑借多年來在互聯(lián)網的打拼,我們在互聯(lián)網網站建設行業(yè)積累了豐富的成都網站設計、網站建設、網站設計、網絡營銷經驗,集策劃、開發(fā)、設計、營銷、管理等多方位專業(yè)化運作于一體。
1.4.3 應用(前端控制器)(1)
1.4.2節(jié)中對原有的MVC模式進行了改進,在入口文件中實現(xiàn)了URL的解析。用戶的每一次請求都指向服務器的***可訪問文件。經過解析URL,最終轉向所要訪問的控制器。但是當系統(tǒng)日趨復雜和多樣時,如URL參數(shù)和POST數(shù)據(jù)需要進行必要的檢查和特殊字符過濾、記錄日志、訪問統(tǒng)計等,如果各種可以集中處理的任務都放在入口文件執(zhí)行,那么將會出現(xiàn)代碼重復、業(yè)務邏輯混亂且分散的情況。因此,為了降低系統(tǒng)代碼邏輯的復雜度,進一步集中控制系統(tǒng),并提高系統(tǒng)的安全控制能力,以及可維護性、可重用性和可伸縮性,本節(jié)中對原有的MVC模式進行了改進,提出了應用(前端控制器)的概念,實現(xiàn)MVC在復雜系統(tǒng)中的前端控制器開發(fā)模式優(yōu)化策略。
1.在應用中實現(xiàn)URL解析
采用前端控制器模式,提供一個處理不同請求的中心,處理工作包括安全事務、視圖選擇、異常處理和響應內容的生成,通過將這些處理工作集中在一點進行,大大降低了PHP代碼量,同時也減少了視圖層的程序邏輯,保證了在不同請求之間可以大量地重用邏輯代碼。
應用(前端控制器)的URL解析功能在文件framework/Cweb- Application.php文件中實現(xiàn),流程圖如圖1-9所示。解析URL代碼如下。
- php
- class CWebApplication {
- public $name;
- //默認控制器是SiteController
- public $defaultController="site";
- //默認動作是actionIndex
- public $defaultAction="index";
- //執(zhí)行應用
- public function run()
- {
- //如URL 為http://hostname/index.php?r=controllerid/actionid
- //得到controllerid/actionid
- if(!empty($_GET['r']))
- {
- $route=$_GET['r'];
- //得到controllerid 賦值給成員變量
- $pos=strpos($route,'/');
- $this->defaultController=substr($route,0,$pos);
- $this->defaultController=strtolower($this->defaultController);
- //得到actionid 賦值給成員變量
- $this->defaultAction=(string)substr($route,$pos+1);
- }
- //得到控制器類名
- $className=ucfirst($this->defaultController).'Controller';
- //獲得控制器文件路徑
- $classFile="./protected/controllers/".$className.'.php';
- //最后一步操作:該類文件存在及該類存在,則導入并調用acion 方法
- if(is_file($classFile))
- {
- if(!class_exists($className,false))
- {
- require($classFile);
- $class= new $className();
- $functionName="action".ucfirst($this->defaultAction);
- $class->$functionName();
- }
- }
- }
- }
2.單例模式創(chuàng)建應用(前端控制器設計模式)
對于系統(tǒng)中的某些類來說,只有一個實例很重要。例如,一個系統(tǒng)中可以存在多個打印任務,但是只能有一個正在工作的任務;一個系統(tǒng)只能有一個窗口管理器或文件系統(tǒng);一個系統(tǒng)只能有一個計時工具或ID(序號)生成器。例如,在Windows中就只能打開一個任務管理器。如果不使用機制對窗口對象進行***化,將彈出多個窗口,如果這些窗口顯示的內容完全一致,則是重復對象,浪費內存資源;如果這些窗口顯示的內容不一致,則意味著在某一瞬間系統(tǒng)有多個狀態(tài),與實際不符,也會給用戶帶來誤解,不知道哪一個才是真實的狀態(tài)。因此,確保系統(tǒng)中某個對象的***性(即一個類只能有一個實例)是非常重要的。
我們希望系統(tǒng)中的應用(前端控制器)只有一個實例對象而且該實例對象易于外界訪問,從而方便應用實例對象個數(shù)的控制并節(jié)約系統(tǒng)資源,單例模式是最好的解決方案之一。
單例模式是一種常用的軟件設計模式。其要點有3個:一是類只能有一個實例,二是它必須自行創(chuàng)建這個實例,三是它必須自行向整個系統(tǒng)提供這個實例。
從具體實現(xiàn)角度來說,就是以下3點:一是單例模式的類只提供私有的構造方法,二是類定義中含有一個該類的靜態(tài)私有對象,三是該類提供靜態(tài)的公有方法用于創(chuàng)建或獲取它本身的靜態(tài)私有對象。在framework/CWebApplication.php文件中添加下面所示的部分代碼。
- php
- class CWebApplication {
- ……
- //定義類的靜態(tài)私有對象
- private static $_app;
- //構造方法在實例對象被創(chuàng)建時自動執(zhí)行
- private function __construct($config=null)
- {
- //獲取配置文件中的數(shù)組
- }
- //靜態(tài)的公有方法用于創(chuàng)建它本身的靜態(tài)私有對象
- public static function createApplication($config=null)
- {
- if(self::$_app===null)
- self::$_app = new CApplication($config);
- return self::$_app;
- }
- //靜態(tài)的公有方法用于獲取它本身的靜態(tài)私有對象
- public static function app()
- {
- return self::$_app;
- }
- //執(zhí)行應用
- public function run(){……}
- }
3.應用的配置文件
默認情況下,應用是一個CWebApplication的實例。要自定義它,通常需要提供一個配置文件以在創(chuàng)建應用實例時初始化其屬性值。這就好比去組裝計算機,客戶拿來具體的配置單,按照要求就可以組裝符合要求的計算機。而CWebApplication就是組裝工人,配置單就是下面要說明的配置文件。
配置信息在配置文件中以數(shù)組元素的方式存放,一個元素就是兩個字符串組成的鍵值對,一個字符串是鍵(key),另一個字符串是這個鍵的對應的值(value)。大多數(shù)的系統(tǒng)都有一些配置常量,將這些常量放在配置文件中,系統(tǒng)通過訪問這個配置文件取得配置常量,就可以通過修改配置文件而無須修改程序達到更改系統(tǒng)配置的目的。系統(tǒng)也可以在配置文件中存儲一些工作環(huán)境信息,這樣在系統(tǒng)每次訪問時,這些信息可以運行在每一個應用的生命周期中。
通常在一個單獨的PHP 腳本(protected/config/main.php)中保存這些配置。在腳本中,通過以下方式返回此配置數(shù)組。
- php
- return array(
- //默認控制器
- "defaultController"=>"default",
- //通過應用全局訪問方法Yii::app()->name;直接訪問。
- "name"=>"my application",
- );
- ?>
在應用的構造方法中添加對配置文件操作的代碼:
- php
- class CWebApplication {
- ……
- //構造方法在實例對象被創(chuàng)建時自動執(zhí)行
- private function __construct($config=null)
- {
- //獲取配置文件中的數(shù)組
- if(is_string($config))
- $config=require($config);
- /*
- 把配置文件中數(shù)組定義的元素賦值給CWebApplication 類中相同成員屬性
- array(
- "name"=>"my application",
- "defaultController"=>"default",
- );
- */
- if(is_array($config))
- {
- /*
- 第一次循環(huán):$this->name=“my application”;
- 第二次循環(huán):$this->defaultController=“default”;
- */
- foreach($config as $key=>$value)
- $this->$key=$value;
- }
- }
- ……
- }
喜歡的朋友可以添加我們的微信賬號:
51CTO讀書頻道二維碼
51CTO讀書頻道活動討論群:365934973
當前題目:1.4.3 應用(前端控制器)(1)
分享網址:http://www.dlmjj.cn/article/dhceghs.html


咨詢
建站咨詢
