Yii использует интуитивно понятное соглашение об именах для пространств имен, которое начинается с \ application и должно соответствовать физической структуре каталогов, подобно встроенной конфигурации автозагрузки.
Если ваш базовый класс MyController находится в защищенном / controllers /, то он должен использовать namespace application\controllers;
<?php
namespace application\controllers;
class MyController extends \CController
{
// actions
}
и дочерний MyController в защищенных / controllers / subdir /
<?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\\
.