2011-01-05 80 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\\