Yii框架中的目录和命名空间控制器实例化

时间:2011-01-05 15:04:53

标签: php yii namespaces spl-autoload-register

Yii框架支持控制器目录中的模块和子目录,因此某些特定操作的路径可能是

  • /index.php?r=module/controller/action
  • /index.php?r=subdirectoryInControllerDir/controller/action

我的目标是在controllers目录中有多个子目录。在这些文件夹中,我将使用名称空间创建与父文件夹相同名称的控制器。

但是,如果我写

namespace mynamespace;
class MyController extends \MyController {
}

Yii会加载MyController而不是mynamespace\MyController;

这里有什么建议吗?

1 个答案:

答案 0 :(得分:1)

Yii使用直观的命名空间命名约定,它从\ application开始,必须遵循物理目录结构,如内置自动加载配置。 如果你的基本MyController类在protected / controllers /中,那么它应该使用namespace application\controllers;

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

和protected / controllers / subdir /

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

要发出类似“subdir / 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),
        );
    }

如果您设置controllerNameSpace CWebApplication,则也可以使用该值代替硬编码\\application\\controllers\\