Друзья
Расширяемая структура директорий в Yii
13 августа 2011
Это адаптированный вольный перевод вики-статьи The directory structure of the Yii project site. Дополнения и багфиксы приветствуются.
В этой статье мы опишем структуру директорий, которая используется официальным сайтом фреймворка Yii. Возможно, данная структура директорий выглядит сложно для маленьких проектов или неоптимально в каких-то иных случаях, однако мы точно уверены в том, что она хорошо подходит для средних и крупных проектов с участием нескольких разработчиков. Более того мы успешно используем такую структуру в нескольких других крупных проектах.
Общая структура
Ниже приведена полная структура директорий, которую мы будем использовать:
/
backend/
common/
components/
config/
params.php
params-local.php *
lib/
Pear/
yii/
Zend/
migrations/
models/
Comment.php
Extension.php
...
console/
commands/
SitemapCommand.php
...
config/
main.php
main-local.php *
params.php
params-local.php *
runtime/
yiic.php *
frontend/
components/
config/
main.php
main-local.php *
params.php
params-local.php *
controllers/
SiteController.php
...
lib/
models/
ContactForm.php
SearchForm.php
runtime/
views/
layouts/
site/
www/
assets/
css/
js/
index.php *
yiic
yiic.bat
В командной разработке мы должны использовать какую-либо систему контроля версий (git, Subversion, Mercurial и т.д.) для кода разрабатываемого проекта. Файлы, помеченные звездочками в структуре директорий выше, не должны находиться в репозитории системы контроля версий (почему, поясняется ниже).
Директории верхнего уровня
На верхнем уровне мы имеем 4 директории:
backend: приложение-бэкэнд предназначенное для управления и администрирования всей системы;frontend: приложение-фронтенд, которое содержит в себе основной функционал системы для конечных пользователей;console: консольное приложение с консольными командами;common: директория, содержащая все те вещи, которые используются в более чем одном приложении системы.
Мы делим всю систему на три приложения: backend, frontend и console. Если появится необходимость в добавлении нового приложения (например, приложение api, которое будет предоставлять API сайта в виде веб-сервиса), то нужно просто добавить новую директорию верхнего уровня с нужной внутренней структурой директорий. Директорию common мы используем для хранения файлов, которые будут использоваться в нескольких приложениях проекта.
Директории приложений
Структуры директорий всех приложений схожи. Приложения frontend и backend имеют следующие директории:
components: содержит компоненты (хелперы и виджеты) которые используются только в данном приложении;config: настройки приложения;controllers: тут находятся контроллеры приложения;lib: здесь размещаются сторонние библиотеки, используемые только в данном приложении;models: содержит в себе модели классов, специфичные для данного приложения;runtime: хранит динамически генерируемые файлы во время выполнения приложения;views: тут находятся шаблоны действий контроллеров;www: корневая директория хоста веб-сервера данного приложения.
Структура директорий консольного приложения console выглядит иначе, потому как это приложение не нуждается в контроллерах, шаблонах и директории хоста веб-сервера (controllers, views и www соответственно). В отличие от других приложений консольное приложение содержит директорию commands в которой находятся файлы классов консольных команд.
Общая директория
Общая директория common содержит файлы, которые используются в нескольких приложениях. Например, каждому приложению требуется доступ к базе данных посредством ActiveRecord. Потому, мы должны хранить классы ActiveRecord моделей в общей директории common. Аналогичным образом дело обстоит и с хелперами и виджетами, которые используются более чем в одном приложении. Они тоже должны быть помещены в директорию common для того, чтобы избежать ненужного дублирования кода.
Чтобы упростить поддержку кода, организация структуры директорий в common примерно такая же, как и в приложениях. Например, вполне возможно, что там будут такие директории, как components, models, lib и прочие.
Чуть ниже будет рассказано о том, что приложения могут разделять между собой и конфигурации. Следовательно, мы должны хранить общие настройки в директории common.
Во время создания крупных проектов с длинным циклом разработки нам периодически приходится менять структуру базы данных. Потому мы используем функционал миграций базы данных для того, чтобы следить за изменениями в ней. Мы храним все эти миграции базы данных в директории migrations внутри общей директории common.
Конфигурации приложений
Приложения одной системы обычно разделяют некоторые общие настройки, такие, как параметры соединения с базой данных, параметры-переменные приложения и прочие. Для того, чтобы предовратить повторение кода, мы должны вычленить эти общие настройки из приложений и начать хранить их в одном общем месте. В нашем случае мы будем хранить их в директории config внутри common.
Разные разработчики одного проекта могут иметь разные рабочие окружения (операционные системы, настройки соединения с базой данных, директория проекта могут быть разными). Среда боевого сервера также отлична от сред разработчиков. Для того, чтобы разработчики не мешали друг другу особенностями своих сред, мы разделяем конфигурацию каждого приложения на две части: базовая конфигурация (например, main.php и params.php) и локальная конфигурация (например, main-local.php и params-local.php).
Базовая конфигурация должна храниться в системе контроля версий кода таким же образом, как и обычный файл исходного кода. Базовая конфигурация должна быть разделена между всеми разработчиками.
Локальная конфигурация не должна помещаться в систему контроля версий кода и может существовать только в рабочей директории каждого разработчика. Разработчик имеет полную свободу действий в его локальном конфигурационном файле.
Для слияния базовой и локальной конфигураций в бутстрап-скрипте index.php мы можем воспользоваться следующим кодом:
require('path/to/yii.php'); $local=require('path/to/main-local.php'); $base=require('path/to/main.php'); $config=CMap::mergeArray($base, $local); Yii::createApplication($config)->run();
Алиасы путей
Для того, чтобы облегчить обращение к файлам других приложений мы можем создать корневой алиас пути site который указывает на корневую директорию всей системы с 4 приложениями в ней. В результате мы можем использовать алиас site.frontend.models.ContactForm для того, чтобы указать на класс ContactForm который был объявлен в приложении frontend.
Развертывание
В процессе разработки или после завершения проекта нам приходится разворачивать его на боевом сервере. Вместо того, чтобы просто закачивать файлы посредством FTP или другого сетевого протокола мы можем воспользоваться системой контроля версий для более удобного развертывания системы.
Боевой сервер можно рассматривать как отдельного разработчика, средой разработки которого и является сам сервер.
Для начала мы чекаутим новую или обновляем уже существующую рабочую копию из системы контроля версий в нужное место на боевом сервере.
Затем мы создаем или изменяем локальную конфигурацию, специфичную для боевого сервера (задатем параметры соединения с базой данных, например). Также возможно нам понадобится установить значение константы YII_DEBUG в ложное значение в бутстрап-файле index.php.
Потому как каждое приложение мы держим в отдельных директориях то, при необходимости все приложения можно развернуть на разных физических серверах.
№ 900
Егор
14 декабря 2011, 11:03
№ 1845
resurtm
1 января 2012, 22:55
№ 1855
Alex
19 января 2012, 14:56
№ 1856
resurtm
19 января 2012, 18:50
Чуть позже выложу рабочий пример с такой структурой директорий, чтобы было понятнее.
№ 1870
Rustamich
29 апреля 2012, 02:26
№ 1880
metalguardian
7 мая 2012, 21:27
№ 1882
TichNeignee
19 мая 2012, 19:49
№ 1883
kvkqdusza
20 мая 2012, 02:05