Много раз мне в сети попадаются такие вопросы, как разделить frontend часть от backend. С frontend вроде и так всё понятно, но как только вопрос доходит до создание backend, люди сразу начинают прислушиваться к тысячам советов о том, как же лучше всего разделить.
Существует не мало вариантов разделения, а так же не мало вариантов реализации backend'а. Самый популярный вариант, это создание backend модулем, и, по-моему мнению, самый лучший вариант. Почему - расскажу далее.
И так, выделим способы реализации backend'a:
- Как отдельное приложение.
- Как единое приложение.
- Модулем.
Первый вариант будет самым толстым. Такой способ подходит для больших приложений, где весь проект тяжело разместить в одном месте. Это хороший вариант, но чаще всего он не нужен, поэтому в этой статье мы его рассматривать не будем, т.к. статья получится очень большой. Этот вариант заслуживает отдельной статьи и для Yii второй версии. =)
Второй вариант, ИМХО, индусский (не в обиду индусам). Мне даже его комментировать не хочется. Кому интересно - в поиск, информации море.
Третий вариант мне нравится больше всех для реализации небольших и средних приложений. Главное, понять как он на самом деле реализован, а то некоторые начинают делать что-то типа:
- backend
-- controllers
--- PostController.php
--- CommentsController.php
-- views
-- models
Ну, как то так. Дак вот, это неправильно! Так делать не нужно. Yii нам предоставляет прекрасную возможность использовать правила маршрутизации, и что из этого следует? Верно! Создаём папку backend в controllers модуля и пихаем все контроллеры для управления модулем туда. Далее, при определённом запросе мы должны получать доступ к этим контроллерам. Всё остальное, что относится конкретно к модулю backend пихаем туда, всё что связано с другими модулями - пихаем в них в директорию backend. По-моему всё просто, в итоге ваши модули должны выглядеть вот так:
- blog
-- controllers
--- backend
---- PostController.php
--- PostController.php
-- views
--- backend
---- post
--- post
-- models
Роуты примерно такие:
'backend/<module:\w+>/<controller:\w+>' => '<module>/backend/<controller>/index',
'backend/<module:\w+>/<controller:\w+>/<action:\w+>/*' => '<module>/backend/<controller>/<action>',
'backend/<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/backend/<controller>/<action>',
Дальше уже как фантазия работает. Я сделал ещё раздельные конфигурационные файлы, и в зависимости от запроса в index.php подключается нужный конфиг:
$path = explode('/', $_SERVER['REQUEST_URI']);
switch ($path[1])
{
case 'backend':
$config = dirname(__FILE__) . '/../protected/config/backend.php';
break;
default:
$config = dirname(__FILE__) . '/../protected/config/frontend.php';
}
$yii = dirname(__FILE__) . '/../framework/yii.php';
require_once($yii);
Yii::createWebApplication($config)->run();
Вот, собственно, и вся магия. :)