Предыдущие серии
1 Вступление
2 Yii, создаем свою CMS. База данных
Наверное в каждом веб-приложении возникает задача разделения, так называемой клиентской или public части — та часть веб-сайта или веб-приложения с которой работает пользователь и админ или back части — часть сайта, с которой работают администраторы, контент-менеджеры и прочие пользователи, отвечающие за наполнение сайта. Сегодня я хочу поговорить о том как это сделать, при использовании фреймворка Yii и какой способ выбрал я при разработке Юпи!.
Критериями для выбора способа будут являться следующие:
- простота реализации
- необходимость выполнять дополнительные «тело движения» (править .htaccess, колдовать с роутингом и т.д.)
И так…
При использовании Yii можно поступить несколькими способами:
- Создать контроллер Admin или Back и всю логику админки реализовывать там;
- В каталоге Controllers создать подкаталог admin или back и все контроллеры и экшены для админки располагать там;
- Админка в виде отдельного модуля Yii;
- Создать два приложения — одно для админской части, другое для клиентской;
Все четыре способа упорядочены по сложности их реализации и по необходимости выполнять дополнительные действия — т.е. писать код!
Кратко рассмотрим достоинства и недостатки каждого из них.
1 Создать контроллер Admin или Back и всю логику админки реализовывать там — наверное самый простой способ.
Достоинтва:
- простота реализации;
- модели используются всем приложением;
Недостатки:
- если админка будет очень большая (с большим функционалом), наш контроллер «раздуется» до огромных размеров, что затруднит сопровождение проекта (эту проблему, отчасти может решить вынесение экшенов в отдельные классы);
- нет отделения админки от остальных частей проекта;
2 В каталоге Controllers создать подкаталог admin или back и все контроллеры и экшены для админки располагать там — второй по сложности реализации способ, забегая вперед, скажу, что я выбрал именно его.
Достоинства:
- админка физически (на уровне каталога файловой системы) отделена от остальных частей проекта, причем это отделение касается не только каталога Controllers, но и каталога View;
- модели используются всем приложением;
Недостатки:
я пока их не нашел 🙂
3 Админка в виде отдельного модуля Yii — по правде говоря, кода я начал разрабатывать Юпи! и столкнулся с проблемой разделения на back и front части — тогда еще не было поддержки модулей в Yii (она появилась в версии 1.0.3), поэтому данный способ я не рассматривал. Если кто-то пытался поступить таким образом — прошу рассказать о своем опыте в комментариях.
4 Создать два приложения — одно для админской части, другое для клиентской — как мне кажется, самый трудоемкий способ.
Достоинства они же, от части, являются и недостатками:
- части системы полностью изолированы друг от друга, из этого следует что без «пляски с бубнами» и дополнительных опций в конфиге не получится использовать модели и библиотеки одного приложения в другом, а отсюда вытекает дублирование кода и все что с ним связано.
Для себя я выбрал способ №2, он, как мне кажется, наиболее удовлетворяет всем моим требованиям.
Таким образом мы имеем следующую структуру проекта.
Вопрос разделения приложения на 2 части поднимался на официальном форуме Yii, почитать можно тут.
Кроме такого вот разделения приложения на две части, для каждой из них я сделал свой базовый контроллер, таким образом все контроллеры клиентской части наследуются от YFrontMainController, а контроллеры админской части от YBackMainController. Введение новых базовых контроллеров позволяет:
- реализовать функционал, специфичный для каждой части приложения, в одном месте, что облегчает повторное использование и сопровождение;
- как правило, для клиентской и адмиской частей используются разные лайауты (layouts), разделение контроллеров позволяет реализовать это очень просто (для этого достаточно переопределить свойство layout);
Например, для всех контроллеров админки, я применяю фильтр, проверяющий авторизацию пользователя, не имея базового контроллера, мне бы пришлось прописывать его во всех контроллерах админки. Так же применяется xss-фильтр, для всех данных, отправляемых из панели администрирования.
Скорее всего, выбранное мной решение, не является идеальным и имеет скрытые (пока!) от меня недостатки, если Вы о таковых знаете — прошу высказываться в комментариях.
Удачного yii-кодинга, друзья!
Обсудить на форуме
Основной сайт Юпи! — http://yupe.ru
Исходный код — https://github.com/yupe/yupe
Присоединяйтесь!