Я думаю, что у любой команды или самостоятельного разработчика на определенном этапе работы формируется некая базовая архитектура приложения, с которой ему или им удобно работать и которую можно перекидывать из проекта в проект. Мне в свое время на глаза попалось архитектурное решение команды CleverTechпод названием YiiBoilerplate. Поскольку я не нашел публикаций на хабре по этой теме, предлагаю небольшой пост.
Вкратце особенности данного шаблона:
- админка и Frontend реализованы в качестве полноценных приложений
- общие настройки, модели и компоненты для Backend и Frontend можно хранить в одном месте
- есть возможность переключения между настройками для Dev и Prod одной строчкой в командной строке
Под катом основная соль данного решения. Текста немного. Предлагаю обсудить иные решения и поделиться собственным опытом по теме архитектуры приложений Yii в комментариях.
Про разделение Backend и Frontend
Архитектура YiiBoilerplate предполагает, что Backend и Frontend проекта реализуются в качестве отдельных приложений со своими настройками. Приложения расположены соответственно в папках Backend и Frontend.
/ backend/ frontend/
Их структура абсолютно идентична традиционной в Yii-приложении.
/frontend components/ config/ controllers/ extensions/ lib/ models/ modules/ runtime/ views/ www/ index.php
При этом общие компоненты, настройки и модели можно вынести в отдельную директорию Common. Там же находится и сам фреймворк.
/ backend/ frontend/ common/ components/ config/ data/ extensions/ lib/ Yii/ messages/ models/ widgets/
То есть, если, допустим, мы используем одну и ту же модель User как в админке, так и на фронте. То можно эту модель поместить в common/models/User.php и она будет доступна и там, и там. Аналогично, к примеру, для настроек базы данных.
Про конфигурации для Dev и Prod
Тут основная фишка заключается в том, что в директориях conf, есть подразделenvironments и файл конфигурации с постфиксом -env.
config/ environments/ main-dev.php main-prod.php main-env.php main.php
Здесь надо отметить, что авторы YiiBoileplate позаботились и добавили в рут репозитория скрипт runpostdeploy, обращаясь к которому из командой строки runpostdeploy EnvType можно сразу переключать настройки приложения с Dev на Prod. EnvType в конкретном случае dev или prod. Это полезно, когда возникает необходимость переносить проект с хоста разработки на боевой.
И напоследок полная структура шаблона, где звездочками отмечены папки, добавленные в gitignore:
/ backend/ components/ config/ environments/ main-private.php * main-prod.php params-private.php * params-prod.php main-env.php * main-local.php * main.php params-env.php * params-local.php * params.php test.php controllers/ SiteController.php extensions/ behaviors/ validators/ lib/ models/ FormModel.php modules/ runtime/ * views/ layouts/ site/ widgets/ www/ assets/ * css/ images/ js/ themes/ index.php .htaccess common/ components/ config/ environments/ params-private.php * params-prod.php params-env.php * params-local.php * params.php data/ extensions/ behaviors/ validators/ lib/ Behat/ Pear/ Yii/ Zend/ messages/ models/ widgets/ console/ commands/ components/ config/ environments/ lib/ migrations/ models/ runtime/ * yiic.php frontend/ components/ config/ environments/ main-private.php * main-prod.php params-private.php * params-prod.php main-env.php * main-local.php main.php params-env.php * params-local.php * params.php test.php controllers/ extensions/ behaviors/ validators/ lib/ models/ modules/ runtime/ * views/ layouts/ site/ www/ assets/ * css/ files/ images/ js/ less/ index.php robots.txt .htaccess tests/ bootstrap/ FeatureContext.php YiiContext.php features/ Startup.feature behat.yml INSTALL.md README.md runbehat runpostdeploy yiic yiic.bat