Разрабатывая любое приложение, разработчик старается сделать его как можно более масштабируемым, легко поддерживаемым и расширяемым. Частично эти задачи решает
Модульность.
Для начала стоит определиться что же такое
модуль в терминах Yii. Как гласит
официальная документация,
Модуль —
это самодостаточная программная единица, состоящая из моделей, представлений, контроллеров и иных компонентов. Основная особенность модулей состоит в том, что их можно использовать в совершенно разных проектах, т.е. написав и отладив модуль один раз — его можно будет использовать и в других проектах… Но это все в теории. На практике же очень часто функциональность модуля зависит от основного приложения или же от других модулей. Например, допустим, мы пишем модуль «Форум» и хотим сделать его автономным и независимым от остального приложения. Тут возникает несколько проблем:
Модуль «Форум» (forum) должен содержать функционал, позволяющий работать с учетными записями пользователей. Этот функционал может быть реализован тремя способами:
1. функционал по управлению пользователями содержится в самом модуле «Форум»;
2. функционал по управлению пользователями оформлен как отдельный модуль, назовем его «Пользователи» (user);
3. функционал по управлению пользователями составляет ядро приложения и все остальные модули опираются на него (частный случай варианта номер два);
Подводные камни, которые можно встретить:
Допустим, кроме форума на нашем сайте должен быть раздел/модуль «Блоги» (blog) и этот раздел так же должен иметь доступ к управлению пользователями — получается что модуль «Блоги» не будет работать без установленного модуля «Форум», так как управление пользователями содержится в нем (рассматриваем вариант 1). Возникает зависимость между модулями. Аналогичная проблема возникнет если мы вынесем управление пользователями в отдельный модуль — тогда, если не установлен модуль «Пользователи», модуль «Форум» тоже не заработает (рассматриваем вариант 2). Получается замкнутый круг. Однако из сложившейся ситуации все же необходимо найти какой-то выход. Самым очевидным способом является выделение некоего
«ядра» или неделимой и целостной части приложения, которая будет присутствовать во всех экземплярах этого приложения. В это ядро, в дальнейшем включается весь функционал, который может быть востребован сторонними модулями. В нашем случае, систему управления пользователями я бы отнес к ядру системы, так как все последующие функциональные модули зависят от этого. Вариант с зависимостями модулей тоже имеет право на существование (вспомним хотя бы систему пакетов (rpm или deb) в современном Linux), но все же, необходимо стремиться делать отдельные части системы как можно более самостоятельными.
Приведу пример на основе php-фреймворков.
ZendFramework славится (некоторым это нарвится, некоторым — нет) своей "
слабой связанностью" это означает, что мы можем взять отдельный компонент (класс) фреймворка и использовать его в любом проекте, написанном не на Zend (часто говорят «Растащить на куски»). А если попытаться сделать тоже самое в Yii? Я думаю, что если и получится это сделать, то придется «вбить пару костылей». Или еще пример —
Symfony я бы не сказал, что он такой «слабо связанный» как Zend, однако стали появляется
компоненты, которые можно использовать независимо от фреймворка. Т.е. Symfony постепенно переходит на «Зендовскую» модель. Я не хочу сказать, что Yii «идет не той дорогой», а просто привел это сравнение в качестве примера.
Такое большое вступление было собственно вот к чему — на этих выходных я проанализировал часть своих проектов, написанных на Yii (и не только) и выделил часть компонентов (модулей), которые писались мною каждый раз с нуля (хорошо что автоматический CRUD Yii позволяет делать это довольно быстро) или «жестко» копировались из проекта в проект и у меня возникла мысль реализовать эти компоненты как отдельные
модули Yii, пригодные для дальнейшего использования.
Вот начальный списочек таких компонентов:
— Управление «Статическими» страницами сайта
— Форма и обработка обратной связи
— Управление пользователями
Хочу отметить что эти компоненты не призваны удовлетворить потребности всех пользователей, т.е. их «конфигурируемость» будет сведена к минимуму (я же не универсальную ЦМС пишу ;-)). В этом плане мне нравится фраза, которую озвучили разработчики Django в ответ на критику их административного интерфейса:
"
если по каким то причинам Вас не устраивает функциональность нашей админки — нет проблем, просто не используйте ее!".
Юпи! — CMS на Yii – http://yupe.ru
Исходный код – https://github.com/yupe/yupe
Присоединяйтесь!
Комментарии (11)
RSS свернуть / развернутьБуквально сегодня утром закончил реализацию другого принципа.
В моей CMS основным элементом является расширяемый объект. Будь то контроллер, модель — не важно.
На него уже вешаются всякие поведения, расширения, дополнения, связки.
Например стандартный контроллер.
К нему подключается несколько расширений:
SEOMeta — Title,keywords,description,sefurl
EventManager — поддержка событий и плагинов через эти события. своеобразные хуки. Помогает при очищении кэшов и прочего
LayoutManager — рулит блоками на странице, ведь разным контроллерам могут потребоваться разные блоки
DocumentManager — рулит документно-ориентированными данными. Например если контроллер страниц, то надо спросить у модели дату изменения и обработать событие If-Modified-Since или послать заголовок Last-Modified с датой изменения. Этот функционал может работать в связке с LayoutManager и посылать более новую дату, если например контент в блоке новее документа. Ещё например рулит кэшэм и его обнулением при необходимости.
SitemapManager — дружит с DocumentManager и генерирует данные для сайтмапа при необходимости
AjaxManager — рулит аяксовыми запросами, поддерживает кэш через Ajax
CssManager — необходим для сбора единого скомпилированного css файла для сайта
JSManager — аналогично CssManager, но рулит уже яваскриптами
и др.
Таким образом в классе контроллера — минимум логики. Все общие поведения, действия реализуются через расширения.
В общем такая вот загагулина.
Bethrezen
В дальнейшем планирую добавить систему хуков (думаю мне для этого хватит стандартных событий Yii) для возможности писать плагины, а может и не добавлю — это уж как пойдет!
Когда ожидается релиз твой системы?
xoma
И я как раз сейчас делаю что-то типа ливстрита, только более сложное и для более широких целей.
+ планирую накатить туда REST,SOAP,XML-RPC как альтернативные протоколы управления.
Сказывается специфика моей основной работы — всегда хочется сделать что-то мега-сложное, гибкое и офигенное
Bethrezen
xoma
Bethrezen
xoma
Только вот некоторые из них связаны друг с другом, так что надо оба юзать.
Это даже больше cmf чем cms. А новый тип контента в админке я пока не собираюсь создавать, может быть потом как нибудь. Сейчас главное запустить
Bethrezen
Думаю, что CssManager и JSManager были бы полезны всему Yii сообществу ;-)
xoma
Bethrezen
xoma
Bethrezen
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.