首頁  >  文章  >  後端開發  >  controler yii框架源碼分析之創建controller程式碼

controler yii框架源碼分析之創建controller程式碼

WBOY
WBOY原創
2016-07-29 08:45:471241瀏覽

使用yii框架的url路徑一般形如hostname/?r=xxxx/xxxx/xxxx&sdfs=dsfdsf
我們可以看到有時會使用protected目錄下的controller,有時會使用module中controller,具體是如何處理的呢,請看以下的分析:
以下程式碼摘自yii框架核心程式碼%Yiiroot%/framework/web/CWebApplication.php

複製程式碼 程式碼如下:


======================================== ==================================================== =======
//1.runController是執行一個controller的方法,$route是$_GET['r']
public function runController($route)
{
/ /在這裡呼叫createController先去建立一個controller實例,由此可見createController是選擇controller的關鍵
if(($ca=$this->createController($route))!==null)
{
list($controller,$actionID)=$ca;
$oldC
$this->_c
$controller->init();
$controller->run($actionID) ;
$this->_c
}
else
throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
array('{route}'=>$route===''?$this->defaultController:$route)));
}
============== ==================================================== ====================================
//2.接下來我們分析createController,假設我們造訪的route是site/contact
public function createController($route,$owner=null)
{
//第一次進入這個函數,$owner參數為空
if($owner= ==null)
$owner=$this;
//如果$route參數中不含/,那麼使用預設的controller
if(($route=trim($route,'/') )==='')
$route=$owner->defaultController;
$caseSensitive=$this->getUrlManager()->caseSensitive;
//為了能夠完整運行下面的循環,給$route後面加上一個/
$route.='/';
//將/的位置保存在$pos中
while(($pos=strpos($route,'/')) !==false)
{
//$id是前半部分,即site
$id=substr($route,0,$pos);
if(!preg_match('/^ w+$/',$id))
return null;
if(!$caseSensitive)
$id=strtolower($id);
//$route變成後半部分,即contact
$route=(string)substr($route,$pos+1);
//controller根目錄或子目錄前綴
if(!isset($basePath)) // first segment
{
//第一次進入,$owner為空,沒有這個成員變數
//非首次進入或$owner有值,有可能設定了這個成員變量,請參考CWebModule類別
if( isset($owner->controllerMap[$id]))
{
return array(
Yii::createComponent($owner->controllerMap[$id],$id,$owner===$ this?null:$owner),
$this->parseActionParams($route),
);
}
//如果能透過getModule方法取得到一個獨立模組,則再次呼叫createController ,適用於site是module名的情況,參考protected/config/main.php設定文件,例如你的controller在%webroot%/protected/module/site/controller/ContactController.php
if(($module= $owner->getModule($id))!==null)
return $this->createController($route,$module);
//controller的目錄:
//對於CWebApplication,對應config['basePath'](參見設定檔)./controller/,例如你的controller在%webroot%/protected/controller/SiteController.php
//對於CModule的子類,對應改子類別所在資料夾./contoller/,例如你的controller在%webroot%/protected/module/site/controller/ContactController.php
$basePath=$owner->getControllerPath();
$c/';
$className=ucfirst($id).'Controller';
$classFile=$basePath.DIRECTORY_SEPARATOR.$className.'.php';
//如果$classFile存在,根據上面所得到的controller類別檔案路徑,建立類別實例
//如果不存在,則是子目錄下的controller,繼續循環尋找最終的controller,例如你的controller在%webroot%/protected/controller/somedir/SiteController
if( is_file($classFile))
{
if(!class_exists($className,false))
require($classFile);
if(class_exists($className,false) && is_subclass_of($className ,'CController'))
{
$id[0]=strtolower($id[0]);
return array(
new $className($controllerID.$id,$owner= ==$this?null:$owner),
$this->parseActionParams($route),
);
}
return null;
}
$controllerID.= $id;
$basePath.=DIRECTORY_SEPARATOR.$id;
}
} 

以上就介紹了controler yii框架原始碼分析之創建controller程式碼,包括了controler方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn