При разработке любого веб приложения перед программистом стоит задача организации управления данными. Реализация административной части — backend приложения. В зависимости от сложности приложения backend может быть представлен одним контролером, выполнен в виде отдельного модуля или в виде отдельного приложения. Первые два подхода является простыми для понимания и не требуют подробного описания. Третий подход достаточно подробно описан в cookbook на официальном сайте Yii фреймворка. Рассмотрим еще один вариант организации — каждый модуль содержит в своем составе и методы для управления, административную часть.
Определимся с структурой. Каждый модуль может содержать контроллеры, модели, отображения. В том числе контроллеры могут располагаться в поддиректории основных контролеров. Пусть в папке admin будут находиться наши контроллеры для управления веб приложением.

При создании веб приложения на Yii используя консольную утилиту, все контроллеры наследуются от Controller, в котором определяется используемый layout, меню и т.п. Естественно для административной части нам необходимо использовать другой layout, и другие основные действия. Поэтому создадим новый экземпляр CController — AdminController.
class AdminController extends CController { public $breadcrumbs=array(); public function init() { Yii::app()->layout = "backend"; } }
Как видно из кода мы используем layout — “backend”. Который мы размещаем в папку с темой для приложения /themes/classic/view/layout/backend.php
Все отображения административного функционала находятся в директории модуля, например так – /modules/modulename/views/admin/action/view.php
Таким образом мы можем произвести перегрузку любого отображения в папке с темой. Для указанного выше примера файла отображения, в папке темы должен быть выдержанна следующая структура.
/themes/classic/views/modulename/admin/action/view.php
Доступ к административной части модуля будет осуществляться по адресу
/module/admin/action/. Используя urlManager произведем переопределение используемых адресов.
Файл конфигурации, по умолчанию /protected/config/main.php
'urlManager'=>array( 'urlFormat'=>'path', 'showScriptName'=>false, 'rules'=>array( 'admin/<_m:\w+>/<_c:\w+>/<_a:\w+>/*'=>'<_m>/admin/<_c>/<_a>', 'admin/<_m:\w+>/<_c:\w+>'=>'<_m>/admin/<_c>/index', 'admin/<_m:\w+>'=>'<_m>/admin/default/index', ) ),
Таким образом доступ к административному функционалу возможен по такому адресу
/admin/modulename/action — что является более наглядным.
Надеюсь эта заметка поможет Вас в организации ваших backend контроллеров. Буду рад любым предложениям и замечаниям.

spasibo. otlichno
Заметка действительно помогла! Сейчас как раз начал думать о системе подключаемых модулей и о том как эти модули будут администрироваться. Ваш вариант вполне работоспособен. Спасибо!
Спасибо. Подобная система используется в Magento, часть кода была взята из нее.
Спасибо, очень интересная статья!
Хорошая система, нравится что код распложен модульно, это удобно и приятно.
Однако есть один минус – невозможно настроить свой defaultController для модуля в случаае админской части. Он его игнорирует, потому что если контроллер не указывается, то работает [module]/admin/default/index.
Есть идеи как поменять?
Спасибо. Надо будет посмотреть подробнее на эту проблему.
С urlManager я еще особо не разобрался. По идее хорошим тоном будет возможность задать default контроллер через конфигурационный файл, но как это сделать для меня пока это загадка.