============ ================================= ================= ================================ ====
//1.runController はコントローラーを実行するメソッドです $route は $_GET['r']
public function runController($route)
{
//ここで createController を呼び出してコントローラーのインスタンスを作成します。 createController がコントローラーを選択するためのキーであることがわかります
if(($ca= $this->createController($route))!==null)
{
list($controller,$actionID)=$ ca;
$oldController=$this->_controller= $controller->init();
$this- >_controller=$oldController;
}
else
throw new CHttpException(404,Yii:: t('yii','リクエスト "{route}" を解決できません。',
array('{route}'= >$route===''?$this->defaultController:$route)) );
}
======================= ======================== ========================= ======================== ===
//2 次に、アクセスするルートが site/contact
public 関数であると仮定して、createController を分析します。 createController($route,$owner=null)
{
//初めてこの関数に入るとき、$owner パラメーターは空です
if($owner===null)
$owner=$this;
// $route パラメーターに / が含まれていない場合は、デフォルトのコントローラー
if(($route=trim($route,'/' ))==='')
$route=$owner->defaultController; を使用します。 $caseSensitive=$this->getUrlManager()->caseSensitive;
//次のループを完全に実行するには、$route を
$route の後に追加します。='/'
//位置を保存します。 of / in $pos
while(($pos=strpos($route,'/'))!==false)
{
//$id は前半、つまりサイト
$id=substr($ルート,0,$pos);
if(!preg_match('/^w+$/',$id))
if( !$caseSensitive)
$id=strto lower($id); $route は後半、つまり contact になります
$route=(string)substr($route,$pos+1);
//コントローラーのルートディレクトリまたはサブディレクトリのプレフィックス
if(!isset($basePath)) //最初のセグメント
{
//初めてのエントリ、$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 がモジュール名の場合に適用されます)。 protected/config/main.php 設定ファイルを参照してください。たとえば、コントローラーは %webroot%/protected/module/site/controller/ContactController.php にあります
if(($module=$ owner->getModule($id) ))!==null)
return $this->createController($route,$module);
//コントローラーのディレクトリ:
//CWebApplication の場合、config['basePath' ] に対応 (構成ファイルを参照) ./controller/、たとえば、コントローラーは %webroot%/protected/controller/SiteController.php にあります
//CModule のサブクラスの場合、サブクラスが配置されているフォルダーに対応します。/controller/、たとえば、次の場合コントローラーは %webroot%/protected/module/site/controller/ContactController.php にあります
$basePath=$owner->getControllerPath();
}
else
$controllerID.=' /' ;
$className=ucfirst($id).'Controller';
$classFile=$basePath.DIRECTORY_SEPARATOR.$className.'.php';
//$classFile が存在する場合、取得したコントローラー クラス ファイルのパスに応じて上記では、クラス インスタンスを作成します
// 存在しない場合は、サブディレクトリ内のコントローラーです。ループを続けて最終的なコントローラーを見つけます。たとえば、コントローラーは %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] =strto lower($id[0]);
return array(
new $className($controllerID.$id,$owner===$this?null:$owner),
$ this->parseActionParams($route) ,
);
$controllerID.=$id;
}
;
http://www.bkjia.com/PHPjc/323762.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/323762.html技術記事 Yii フレームワークを使用する URL パスは通常、hostname/?r=xxxx/xxxx/xxxxgt;createController($route))!==null) { list($controller,$actionID)=$ca; の形式になります。 =$this- _コントローラー $this-_con...