yii框架支持controllers目录中的模块和子目录,因此某些特定操作的路径可以是/index.php?r=module/controller/action
或/index.php?r=subdirectoryInControllerDir/controller/action
。
我的目标是在控制器目录中有多个子目录。在这些文件夹中,我将使用名称空间创建与父控制器同名的控制器。
但是如果我写
namespace mynamespace;
class MyController extends \MyController {
}
yii将加载
MyController
而不是mynamespace\MyController;
有什么建议吗?
最佳答案
yii对名称空间使用直观的命名约定,该命名约定从\ application开始,并且必须遵循物理目录结构,如内置的autoload config。
如果您的基本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\\
。关于php - Yii框架中按目录和 namespace 的 Controller 实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4872488/