【问题标题】:Controller instantiation in Yii framework by directory and namespaceYii 框架中通过目录和命名空间实例化控制器
【发布时间】:2011-06-19 20:08:17
【问题描述】:

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

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

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

但是如果我写

namespace mynamespace;
class MyController extends \MyController {
}

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

这里有什么建议吗?

【问题讨论】:

  • 我认为最好在 Stack Overflow 中提出这个问题。如果是这样,我可以返回赏金并迁移问题。如果您同意,请告诉我。
  • 这看起来确实像 SO 材料。

标签: php yii namespaces spl-autoload-register


【解决方案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),
        );
    }

如果您设置了controllerNameSpaceCWebApplication,您也可以使用该值而不是硬编码\\application\\controllers\\

【讨论】:

    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2013-01-11
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多