Создание экземпляра контроллера в среде Yii по каталогу и пространству имен - PullRequest
3 голосов
/ 05 января 2011

Yii Framework поддерживает модули, а также подкаталоги в каталоге контроллеров, поэтому путь к какому-либо конкретному действию может быть

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

Моя цель здесь - иметь несколько подкаталогов в каталоге контроллеров. Внутри этих папок я бы создал контроллеры с теми же именами, что и у родительских, используя пространства имен.

Однако, если я напишу

namespace mynamespace;
class MyController extends \MyController {
}

Yii будет загружать MyController вместо mynamespace\MyController;

Есть предложения?

1 Ответ

1 голос
/ 02 мая 2013

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\\.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...