Yii フレームワークを使用した URL パスは通常、hostname/?r=xxxx/xxxx/xxxx&sdfs=dsfdsf の形式になります。
保護されたディレクトリ内のコントローラーが使用される場合と、モジュール内のコントローラーが使用される場合があることがわかります。具体的にどう対処すればよいでしょうか? 次の分析を見てください:
次のコードは yii フレームワークのコア コード %Yiiroot%/framework/web/CWebApplication.php からの抜粋です
コードをコピーします以下:
============ ================================= ================= ================================ ==
//1.runController はコントローラーを実行するメソッドです $route $_GET['r'] です
public function runController($route)
{
//ここで createController を呼び出して、まずコントローラーのインスタンスを作成します。 createController がコントローラーを選択するためのキーであることがわかります
if(($ca=$this ->createController($route))!==null)
{
list($controller,$actionID)=$ca ;
$oldC
$this->_c
$controller->run($actionID)
}
else
新しい CHttpException(404) ,Yii::t('yii','リクエスト "{route}" を解決できません。',
array('{route}'=>$route===''?$this->defaultController: $route)))
}
============= ========================== ======================= ========================== ========
//2. 次に、アクセスルートが site/contact であると仮定して、createController を分析します
public function createController($route,$owner=null)
{
//初回は $owner パラメータが空です
if($owner===null)
$owner=$this;
//$route パラメータに / が含まれていない場合は、デフォルトのコントローラを使用します
if(($route =trim($route,'/'))==='')
$route=$owner->defaultController ;
$caseSensitive=$this->getUrlManager()->caseSensitive
//順番に次のループを完全に実行するには、$route の後に / を追加します
$route.='/'
//Replace / 場所は $pos に保存されます
while(($pos=strpos($route,'/') )!==false)
{
//$id は前半、つまりサイト
$id=substr($route ,0,$pos);
if(!preg_match('/^w+$/' ,$id))
return null;
if(!$caseSensitive)
$id=strto lower($id);
//$ ルートが後半、つまり 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 メソッドで独立したモジュールを取得できる場合は、site がモジュール名である場合に適用されます。 protected/config/main を参照してください。たとえば、コントローラーは %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();
$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),
}
return null;
$controllerID.=$id; BasePath.=DIRECTORY_SEPARATOR.$id
}
}
上記では、コントローラーの側面を含む、コントローラー yii フレームワークのソース コードの分析とコントローラー コードの作成について紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。