2011-01-05 10 views
3

のYiiフレームワークでは、コントローラーのディレクトリ内のモジュールともサブディレクトリをサポートしていますので、いくつかの特定のアクションへのパスはコントローラのインスタンス化が

  • /index.php?r=module/controller/actionまたは
  • /index.php?r=subdirectoryInControllerDir/controller/action
  • である可能性があります。

ここでの目標は、コントローラディレクトリに複数のサブディレクトリを作成することです。これらのフォルダの中で、名前空間を使って親と同じ名前のコントローラを作成します。

は、しかし、私は

namespace mynamespace; 
class MyController extends \MyController { 
} 

を書く場合YiiはここMyController代わりのmynamespace\MyController;

任意の提案をロードしますか?

+3

これは、スタックオーバーフローでよく尋ねられると思います。もしそうなら、私は賞金を返還し、質問を移行することができます。あなたが同意すれば私に知らせてください。 – ChrisF

+0

これは本当にSOの材料のように見えます。 –

+0

心配する必要はありません! – ozz

答えて

1

Yiiは、\ applicationから始まり、組み込みのautoload設定のような物理ディレクトリ構造に従わなければならない、名前空間のための直感的な命名規則を使います。 お使いのベースMyControllerクラスが保護/コントローラ/内にある場合、それはサブディレクトリ「のようなリクエストを作成するには、保護/コントローラ/サブディレクトリ内namespace application\controllers;

<?php 
namespace application\controllers; 
class MyController extends \CController 
{ 
    // actions 
} 

と子MyController/

<?php 
namespace application\controllers\subdir; 
class MyController extends \application\controllers\MyController 
{ 
    // actions 
} 

を使用する必要があります/ my "の場合は、クラスファイルが含まれた直後にCWebApplication::createController()に次のコードを追加する(またはサブクラスで継承する)必要があります。

if(!class_exists($className,false)) 
     require($classFile); 
+ if(!class_exists($className,false)) 
+  $className = '\\application\\controllers\\' . str_replace('/', '\\', $controllerID . $className); 
    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), 
     ); 
    } 

controllerNameSpaceCWebApplicationに設定した場合は、\\application\\controllers\\をハードコードする代わりにその値を使用することもできます。

関連する問題