国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

26.Yii 模塊(2)

2019-11-14 09:15:47
字體:
供稿:網(wǎng)友

模塊結(jié)構(gòu)

在YII中,程序入口是一個繼承Capplication的CWebApplication的應(yīng)用程序,在一個web請求的整個過程中,控制器,模型和視圖都是由Application進(jìn)行創(chuàng)建和控制。首先我們來看一下CWebApplication的類的繼承結(jié)構(gòu):

這里寫圖片描述

從上面我們可以看到CWebApplication本身也是一個CModue。在YII中,模塊之間是一個樹形結(jié)構(gòu)。即每一個模塊都可以包含多個子模塊,每一個子模塊可以繼續(xù)包含子模塊.其中APP為樹的頭節(jié)點,如圖:

這里寫圖片描述

對于一個具體請求,假設(shè)route=A/B/C/D,下面我們講述一下,APP怎么選擇相應(yīng)的模塊和模塊中的控制器Controller和動作Action。具體的流程圖如下:

這里寫圖片描述 這里寫圖片描述

對于讀過YII源碼都直到,任何一個web請求都是通過CApplication::Run()函數(shù)開始,進(jìn)入到CWebApplication::PRocessRequest()。源碼分別如下:

這里寫圖片描述

程序真正的進(jìn)行到相應(yīng)模塊,控制器,動作是在函數(shù)processRequest的$this->runController($route);中,該函數(shù)傳入的參數(shù)為$route。何為 $route。其實$route是一個類似A/B/C/D格式的字符串,該字符串中可能包含了模塊,控制器,動作和$_GET相關(guān)參數(shù)。該函數(shù)是也是定義在CWebApplication中。代碼如下:

這里寫圖片描述

通過該函數(shù)的名稱字面意思為"運行控制器"。因此首先第一步就是要創(chuàng)建一個控制器,即函數(shù)createController($route)。我們知道控制器的是包含在模塊中,因此也在該函數(shù)中,通過分析$route可以得到相應(yīng)的模塊,以及模塊中的控制器和相應(yīng)的動作,即list($controller,$actionID)=$ca;上面的流程圖即為該函數(shù)createController($route)的函數(shù)流程圖。現(xiàn)在應(yīng)該清楚了一個模塊是怎么被web用戶所調(diào)用了吧。下面我們說一下程序怎么在應(yīng)用程序中添加模塊,當(dāng)然可能是通過配置文件。

添加模塊 這里寫圖片描述 這里寫圖片描述 這里寫圖片描述


模塊源碼分析 這里寫圖片描述 這里寫圖片描述 這里寫圖片描述

public function __construct($id,$parent,$config=null)//$id為模塊ID,$parent為父模塊ID { $this->_id=$id; $this->_parentModule=$parent; // set basePath at early as possible to avoid trouble if(is_string($config)) $config=require($config); if(isset($config['basePath'])) { $this->setBasePath($config['basePath']);//設(shè)置模塊路徑 unset($config['basePath']); } Yii::setPathOfAlias($id,$this->getBasePath());//把該模塊的路徑添加到Alias中,方便訪問 //下面幾個函數(shù)就是模塊的初始化需要做的幾件事情,可以通過重寫preinit()和init()來自定義模塊可以通過自定義相應(yīng)的函數(shù)來定制和初始化模塊的參數(shù) $this->preinit();//預(yù)初始化,一般用來設(shè)置模塊相關(guān)的行為對象$behaviors[],預(yù)加載對象$preload[],和其他配置。 $this->configure($config);//加載配置 $this->attachBehaviors($this->behaviors);//掛載行為對象 $this->preloadComponents();//加載CModule::$preload[]中的預(yù)加載組件 $this->init();//模塊真正初始化,一般情況下,重寫該函數(shù)完整模塊初始化 }

CWebModule分析 這里寫圖片描述

public function beforeControllerAction($controller,$action) { if(($parent=$this->getParentModule())===null) $parent=Yii::app(); return $parent->beforeControllerAction($controller,$action); } public function afterControllerAction($controller,$action) { if(($parent=$this->getParentModule())===null) $parent=Yii::app(); $parent->afterControllerAction($controller,$action); } 可以通過此兩個函數(shù)對該模塊中的每一個請求進(jìn)行一些改寫,控制以及收尾的相關(guān)工作。在自定義的模塊中,兩個函數(shù)的覆蓋的模版如下:public function beforeControllerAction($controller, $action) { if(parent::beforeControllerAction($controller, $action)) { // this method is called before any module controller action is performed // you may place customized code here return true; } else return false; }

這里寫圖片描述 這里寫圖片描述 這里寫圖片描述 這里寫圖片描述 這里寫圖片描述 這里寫圖片描述

array( 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',//模塊的路徑 'preload'=>array('log'),//需要預(yù)先加載日志組件 'import'=>array('application.models.*', 'application.components.*',),//需要include的路徑 //組件的配置 'components'=>array( 'user'=>array(//用戶組件的配置 'allowAutoLogin'=>true ), 'log'=>array(//日志組件的配置 'class'=>'CLogRouter', 'routes'=>array(array('class'=>'CWebLogRoute','levels'=>'trace, profile')) ) ), //模塊的配置 'modules'=>array( 'gii'=>array(//自動生成代碼模塊的配置 'class'=>'system.gii.GiiModule', 'passWord'=>'123456' ), ),);

http://blog.csdn.net/colzer/article/details/8443042


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 万宁市| 余干县| 温宿县| 犍为县| 葫芦岛市| 乡城县| 当涂县| 阳山县| 出国| 九龙坡区| 佛教| 兴文县| 永顺县| 怀宁县| 交城县| 名山县| 和硕县| 孝昌县| 彭州市| 贵阳市| 隆德县| 乡宁县| 五大连池市| 耿马| 湘潭县| 巧家县| 招远市| 阆中市| 塔河县| 公主岭市| 隆子县| 临夏县| 蓝山县| 舒城县| 岑溪市| 湘西| 新竹市| 云林县| 黄骅市| 砀山县| 库尔勒市|