2011-01-05 74 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 2011-01-31 14:32:24

回答

1

Yii對名稱空間使用直觀的命名約定,該命名約定從\ application開始,並且必須遵循物理目錄結構,如內置的自動載入配置。 如果你的基礎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 
} 

要像「子目錄的請求/我的「工作,您需要在包含類文件後將以下代碼添加到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\\

相關問題