Мои размышления на тему модулей в Yii и модульности вообще

Yiiframework 7 июня 2010 г., 18:35

Разрабатывая любое приложение, разработчик старается сделать его как можно более масштабируемым, легко поддерживаемым и расширяемым. Частично эти задачи решает Модульность.

Для начала стоит определиться что же такое модуль в терминах 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

Присоединяйтесь!



Комментарии 10

xoma
xoma
У разрабатываемых нами систем совсем разные назначения =) Я хочу попытаться сделать что-то типа LiveStreet (на котором работает этот блог) Основной принцип — минимум конфигурируемости в пользу простоты и скорости. В дальнейшем планирую добавить систему хуков (думаю мне для этого хватит стандартных событий Yii) для возможности писать плагины, а может и не добавлю — это уж как пойдет! Когда ожидается релиз твой системы?
Bethrezen
Bethrezen
Эта ветка в паблик не пойдет ещё долго. И я как раз сейчас делаю что-то типа ливстрита, только более сложное и для более широких целей. + планирую накатить туда REST,SOAP,XML-RPC как альтернативные протоколы управления. Сказывается специфика моей основной работы — всегда хочется сделать что-то мега-сложное, гибкое и офигенное
xoma
xoma
А можешь рассказать про основные возможности? И что значит «более широких целей»? Это будет блого-социальная сеть или что-то иное?
Bethrezen
Bethrezen
ну вообще это для интернет-журнала разрабатывается в первую очередь. В дальнейшем планирую на все часто-используемые задачи использовать. Для того же самого дебо подошло бы например.
xoma
xoma
Ну т.е. ты все же пишешь универсальную ЦМС, в которой можно создавать новые типы контента (скорее всего через админку), у меня же немного другое. Скажи, пожалуйста, твой вот эти компоненты, перечисленные в первом комментарии, они могут быть использованы независимо от твоего движка? Т.е. могу ли я некоторые из них применить в своем проекте?
Bethrezen
Bethrezen
Если ты у меня их украдёшь — то да ) Только вот некоторые из них связаны друг с другом, так что надо оба юзать. Это даже больше cmf чем cms. А новый тип контента в админке я пока не собираюсь создавать, может быть потом как нибудь. Сейчас главное запустить
xoma
xoma
«Если ты у меня их украдёшь — то да )» — а ты их в паблик не хочешь выложить? Думаю, что CssManager и JSManager были бы полезны всему Yii сообществу ;-)
Bethrezen
Bethrezen
Пока я не допишу всё до конца и не запущу свой проект — бесполезно выкладывать. Всё может конкретно измениться в любой момент
xoma
xoma
Ну если твои компоненты не зависят от твоего движка (слабо связанны), то публикация их для общего доступа — напротив поможет быстрее протестировать и исправить баги =) ИМХО.
Bethrezen
Bethrezen
Я могу их внутреннюю концепцию поменять легко
Пожалуйста, авторизуйтесь или зарегистрируйтесь для комментирования!