Главная > PHP > Архитектура CMS на фреймворке Yii.

Архитектура CMS на фреймворке Yii.

Я написал на Yii один крупный проект, несколько мелких, и сейчас заканчиваю еще один крупный проект. Познакомился я с Yii год назад. Не сказал бы что я досконально с ним разобрался, но все же опыт какой то появился.

Вот хотел бы поделиться тем, как я организую приложение на Yii.

И так, архитектура папок у меня такая

assets
libs
protected
        components/
        config/
        controllers/
        data/
        extensions/
        messages/
        models/
        modules/
        runtime/
        tests/
public
themes

Ну во, вроде ничего лишнего нет.

Теперь к сути. Не пойму, зачем по умолчанию в Yii в корневом каталоге есть папки css, js и images. Ведь есть же папка для тем themes, пусть там и лежат. Ведь все это относится только к темам. Да, я согласен, что иногда, JS тоже выполняет операции не только визуального оформления, но в основном такие скрипты принадлежат конкретному модулю и находятся в папке assets данного модуля, либо мы выносим этот файл(ы) в библиотеку.

Папка assets, всем понятно для чего, там хранятся временные файлы.

В папке libs я собираю JS библиотеки и JS скрипты которые требуются в разных частях приложения, такие как uploadify, lightbox, jquery.bxSlider и другие. В основном это сторонние разработки. Почему меня не устроило название папки JS и я его переименовал в libs спросите вы. Дело в том, что в этой папке хранится целиком и полностью вся библиотека со стилями и картинками для нее. А дает это нам то, что при добавлении новой библиотеки не придется ее расчленять(стили в 1 папку, скрипты в другую, картинку в третью) и потом в стилях, и не дай бог в JS, менять пути к картинкам.

В папке public у меня для каждого модуля создается папка(если необходимо) и там лежат все публичные файлы. Картинки товаров для интернет-магазина,  файл загруженные пользователем и т.д.

В папке components у меня тоже не все стандартно, там лежат 2 класса

MasterBackEndController

MasterFrontEndController

Оба они унаследованы от основного класса Controller. В каждом модуле есть папка components и там 2 класса. Как вы правильно догадались BackEndController и FrontEndController. Они унаследованы от MasterBackEndController и MasterFrontEndController соответственно. Таким образом для Админки мы можем задавать общие функции и переменные для всех модулей, и для каждого модуля в отдельности, что по моему очень хорошо. Вот у меня в MasterBackEndController и MasterFrontEndController сразу стоят разные layout. И в MasterBackEndController стоит фильтр по правам доступа.

public function filters() {
return array('rights');
}

Честно признаюсь, что я еще не думал как реализовать разные темы для back и front режимов, но это необходимо сделать. Просто руки не доходят.

Таким образом, получается, что все мое приложение состоит из модулей  в которых контроллеры, отвечающие за back функционал унаследованы от BackEndController а контроллеры, отвечающие за front, унаследованы от FrontEndController.

Да я делаю разделение. Весь контроллер отвечает либо за back, либо за front.

Суть: админка у каждого модуля своя!

Как жеж так спросите вы. А все очень просто. У меня есть модуль Admin. Его задача формировать меню панели администратора.

Мы создаем меню, допустим такого вида:

-Контент

---Статьи // модуль article

---Новости // модуль news

---Информ. Страницы // модуль page

У каждого такого пункта меню есть поля:

1) Права (Тут мы назначаем видимость данного пункта конкретной роли. Допустим так Manager, или  так Article.Admin.*. Формат модуля Rights )

2) Корневому пункту меню(в данном случае “Контент”) мы еще списком присваиваем названия модулей на которых это меню отображается. Допустим мы присвоили такую строку “article, news”.

Это означает, что если мы в данный момент находимся в БэкЕнде модуля news то нам отображаются все дети меню “Контент” с учетом прав доступа.

Да, тут есть свои ограничения. По сути, мы просто группируем модули в логические разделы.

Подытожим:

У меня всю приложение состоит из модулей. В каждом модуле есть FrontEnd и BackEnd контроллеры унаследованные от соответствующих контроллеров.

Один модуль администрирования, который управляет пунктами меню в панели администрирования. Все сторонние JS библиотеки лежат в папке libs, все что касается визуального оформления лежит в темах.

Есть какие-нибдь мысли по этому поводу? Делитесь в комментариях.

Поделиться в соц. сетях

Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

PHP , ,

  1. Дима
    24 Ноя 2011 из 12:22 | #1

    Я бы тоже хотел освоить Yii, но там столько всего по напихали что сидеть разбираться месяцами я не хочу. Уже пытался.
    Пользуюсь fuelphp – а если что то надо я просто могу переделать строннюю библиотеку под себя и все.
    Выражаю вам свое подчение за знание yii, что бы его выучить надо иметь очень большое желание и много времени.

  2. 24 Ноя 2011 из 12:27 | #2

    Спасибо =)
    Да нет, на самом деле ничего сложного. Достаточно написать несколько проектов, более менее сложных и все, вы хорошо освоили Yii. А если еще и просто мануалы почитать так вообще замечательно.
     
    Хотя мне просто может сравнивать не с чем, Это мой первый PHPшный  фреймворк.

  3. 15 Дек 2011 из 12:07 | #3

    Вы не задумывались над идеей создания CMS на yii? Лично я собираюсь приступить к выполнению этой задачи после окончания 2011 года, а пока курю мануалы лазаю по блогам и пишу первый проект каталог недвижимости.

  4. 15 Дек 2011 из 13:01 | #4

    Нет, не задумывался.
    Что бы написать нормальную CMS нужно очень много времени. Если писать ее одному, то пока половину напишешь, уже что-то новое выйдет, и будешь изменять, изменять и так бесконечно.
    Время на написание CMS к сожалению не оплачивается, так что давайте оставим эту работу профи, которые за разработку CMS ежедневно получают деньги.
    Если вы студент, или школьник, или у вас просто есть свободное время то тогда вам рекомендуется написать свою CMS, так как это огромный опыт.

  5. 15 Дек 2011 из 13:28 | #5

    Да я студент. У меня тема диплома написание CMS для блогов. Выбрал YII хотя сначала думал писать на Zend.  

  6. 15 Дек 2011 из 13:41 | #6

    Ну тогда вам очень повезло =)
    У меня тема диплома была “Разработка технологического процесса и производства вала-шестерни редуктора привода двух-спирального классификатора”

  7. Александр
    03 Фев 2012 из 14:02 | #7

    Ого. А обоснование разработки новой cms будете делать? Т.е. какие сильные стороны будут у вашей cms по сравнению с тем же wordpress?

    • 04 Фев 2012 из 8:50 | #8

      Боже упаси делать конкурента вордпресу.

      Под CMS я подразумеваю систему оправления контентом. По сути любой сайт где есть админка позволяющая менять информацию на сайте есть CMS.

      Я не хочу, и надеюсь что никогда не буду писать универсальные CMS. И вам не советую. Только для получения опыта.

      В статье я поделился видением архитектуры файлов и папок под фреймворк Yii, для написания какого либо сайта, который будет расширять свой функционал модулями и виджетами.

  8. Александр
    07 Март 2012 из 22:30 | #9

    Здравствуйте ,Профессор.

    А не могли бы вы поделиться написанным вами приложением?
    (мне просто очень нужно освоить Yii! И хотелось бы сразу посмотреть на код реально рабочего проекта, а не “Hello Word”) 

  1. Трекбеков пока нет.