Перевод файла Readme.md, размещённого в папке проекта YiiBoilerplate на GitHub от компании Clevertech.
Оригинал: Copyright © Clevertech
Перевод: Copyright © 2014 Фёдоров Александр
Предисловие
YiiBoilerplate - это структура веб-приложения уровня предприятия. Что называется "из коробки".
Раз за разом создавая корпоративные веб-сайты для средних предприятий с использованием фреймворка Yii мы выработали стандартную структуру проекта. Изначально он базировался на следующих положениях:
- раздельные сайты для пользовательской ("frontend") и административной ("backend") частей в целях безопасности;
- модульная структура приложения - так, чтобы можно было бы вести независимые ветки модулей в системе контроля версий.
Эти два положения привели к значительным изменениям традиционной структуры проекта, описанной в учебнике по Yii. Они также повлияли на терминологию и привели к определению двух понятий: "точка входа" ("entry point") и "окружение" ("environment").
Мы используем эту структуру для разработки сайтов уже некоторое время, и она доказала свою высокую эффективность. Эта статья описывает полностью переработанный YiiBoilerplate и все его функции, добавленные в последнее время.
Мы надеемся, что этот шаблон будет вам полезен.
Жизненный цикл
Прежде всего мы должны заметить, что YiiBoilerplate не является ни библиотекой, ни новым фреймворком. Это исключительно шаблон, который используется при старте проекта. Поэтому нет смысла думать об "обновлениях" или "будущих версиях" как только вы запустили на нём свой проект - просто дорабатывайте его так, как вам необходимо.
Требования
- PHP 5.4. Уже даже стабильная версия Debian, известная своим консерватизмом в вопросах обновлений, содержит версию 5.4. Поэтому либо обновляйте PHP до версии 5.4., если это возможно, либо прекращайте пользоваться хостингом с устаревшими версиями PHP.
- Желательно: поддержка работы архивов PHAR из консоли (она также должна быть включена в
php.ini
). - Опционально: Java для запуска Selenium.
- Опционально: Virtualbox и Vagrant для быстрого развёртывания локальных окружений.
Самый простой способ развернуть окружение
-
Установить Vagrant (не описывается в данной статье).
-
Установить Virtualbox (не описывается в данной статье).
-
Если у вас уже установлен PHP 5.4+ (а это имеет смысл из-за новых возможностей), у вас есть всё необходимое для YiiBoilerplate.
-
Теперь просто клонируйте репозиторий YiiBoilerplate:
git clone Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.:clevertech/YiiBoilerplate.git <yourprojectname>
-
Изнутри клонированной директории запустите и дождитесь завершения:
vagrant up
Vagrant может жаловаться на различие версий гостевых дополнений Virtualbox'а и самого Virtualbox'а. Это решается запуском
vagrant plugin install vagrant-vbguest
, и это единственный не очевидный шаг, с которым вам придётся столкнуться. -
Готово. По адресу http://localhost:8080/ будет располагаться пользовательская часть вашего сайта, по http://localhost:8081/ - административная.
Можно начинать работать.
Не забывайте выполнять команду выключения виртуальной машиныvagrant halt
перед тем, как выключить свою рабочую станцию, Virtualbox может не выключиться пока не получит командуkill -9
.
Настройка вручную
Для выполнения всех настроек вручную можно обратиться к файлам carcass/vagrant/prepare-precise64.sh
и carcass/vagrant/setup-app.sh
.
Полный отчёт о состоянии проекта
Мы интегрировали практически все инструменты из проекта PHP QA Tools в систему сборки проектов Phing.
Чтобы получить отчёты всех возможных статических анализаторов кода вашего проекта плюс документацию по API, просто наберите:
bin/phing
В результате в папке reports
будут созданы следующие отчёты:
- Отчёт о нарушениях в стиле кода в формате Checkstyle от PHP Code Sniffer;
- Отчёт о покрытии кода тестами в формате Clover от PHPUnit
- Отчёт о дублировании кода в формате XML от PHP Copy-Paste Detector
- Отчёт об объёме кода в формате XML от PHPLOC
- Отчёт о различных проблемах в формате XML от PHP Mess Detector
- Отчёт в XML от PDepend
- Две схематичных метрики кода в формате SVG от PDepend
- Отчёт о покрытии кода тестами в формате HTML от PHPUnit
- Дерево проекта в виде HTML страниц со всем кодом и выявленными проблемами от PHP Code Browser
- и, наконец, автоматически сгенерированная документация по API в HTML формате от ApiGen.
Мы уверены, что этого набора отчётов будет достаточно для понимания состояния, в котором находится ваш проект.
Понятно, что для генерации отчёта о покрытии кода тестами будут выполнены все модульные тесты. Таким образом, в качестве побочного эффекта, вы получите регрессионное тестирование (надеемся, что ваши тесты выполняются сравнительно быстро).
Обзор
Давайте теперь заглянем внутрь.
YiiBoilerplate был разработан для веб-приложений среднего размера и любого назначения, разрабатываемых на базе фреймворка Yii. Под "средним размером" мы понимаем от 10 до 100 уникальных маршрутов. Опять же поддерживается два уровня тестов для разработки через тестирование: приёмочные тесты с помощью Behat, а также модульные и интеграционные тесты с помощью PHPUnit.
По большому счёту, YiiBoilerplate - это набор папок и файлов, которые вы загружаете в вашей системе контроля версий в качестве первого коммита. Он представляет собой каркас сайта, состоящий из пустой заглавной страницы пользовательской части и административной части с простейщим UI и уже подключённым механизмом аутентификации на основании паролей.
Содержание каждой папки подробно описано в файле README.md
внутри соответствующей папки.
Папки верхнего уровня
-
backend
Точка входа в административную часть приложения.
-
bin
Двоичные (бинарные) файлы, которые используются приложением. В том числе
yiic
,phing
,phpunit
и т.п. Заметим, что хотя большинство файлов устанавливается через Composer,yiic
иselenium
устанавливаются вручную и не должны быть изменены или удалены. -
carcass
Файлы конфигурации для различных дополнительных инструментов, используемых в проекте. Например, скрипты для Vagrant или настройки стиля кода для CodeSniffer.
-
common
Эта папка в точности повторяет традиционную папку
protected
в автоматически создаваемом проекте Yii. Весь код, общий для всех точек входа должен помещаться в папкуcommon
. Код, специфичный для административной, пользовательской или консольной частей, должен помещаться соответственно вbackend
,frontend
илиconsole
. -
console
Точка входа для консоли, к которой подключается
yiic
. Большинство кода - это миграции для БД в подпапкеconsole/migrations
. -
frontend
Точка входа для пользовательской части сайта.
-
reports
Все отчёты о статусе проекта, качестве кода и т.п. Документация по API от APIGen тоже хранится здесь. Вначале этой папки нет, она создаётся при необходимости.
-
tests
Все ваши тесты. Подробнее см. файл
README.md
внутри папки. -
vendor
Все сторонние приложения, установленные через Composer, в том числе Selenium. Эта папка тоже создаётся при необходимости.
Дерево конфигураций
Структура конфигураций
Наиболее сложная часть приложения на основе YiiBoilerplate - это конфигурация, составленная из нескольких частей.
Конфигурация для различных частей приложения состоит из следующих частей (каждая следующая замещает предыдущую):
- Общий базовый конфигурационный файл
- Конфигурационный файл, зависящий от окружения
- Локальные настройки для общего конфигурационного файла
- Базовый конфигурационный файл для определённой точки входа
- Конфигурационный файл для определённой точки входа, зависящий от окружения
- Локальные настройки для конфигурационного файла для определённой точки входа
Например, для пользовательской части список конфигурационных файлов будет такой:
common/config/overrides/base.php
common/config/overrides/environment.php
common/config/overrides/local.php
frontend/config/overrides/base.php
frontend/config/overrides/environment.php
frontend/config/overrides/local.php
Локальные настройки и настройки для окружений могут отсутствовать.
Вы можете проследить дерево включений файлов командой require
начиная с файла frontend/config/main.php
. Этот конфигурационный файл является основным для настройки приложения. На самом деле это всего лишь четыре строки, подключающие тот или иной файл из шести представленных выше вариантов.
Локальные настройки
Локальные настройки достаточно просты. Это в большинстве своём непереносимые части конфигурационных файлов - такие как доступ к локальной базе данных и т.п. Подпапка config/overrides
во всех папках конфигурации common
, frontend
, console
и backend
содержит файл local-example.php
, который вы можете скопировать с именем local.php
и сразу же использовать по своему усмотрению.
Эти файлы не должны попадать в репозиторий, т.к. содержат настройки, специфические для локальной машины разработчика.
Настройки окружения
Части конфигурации для различных окружений расположены в папке config/environments
. Вы можете указать разные параметры - такие как пути к БД, механизмы кэширования, а также параметры, зависящие от ОС и т.п.
Чтобы активировать настройки определённого окружения необходимо скопировать файл конфигурации из подпапки config/environments
в config/overrides/
с именем environment.php
. Эта очевидно рутинная задача автоматизирована с помощью команды:
bin/yiic environment set --id=<environmentname>
Конечно каждая подпапка config/environments
для каждой точки входа должна содержать файл конфигурации с именем <environmentname>
.
Файлы конфигурации окружений должны помещаться в репозиторий, т.к. они содержат настройки приложения для определённых рабочих условий.
В свою очередь ничто не заставляет вас использовать механизм настроек для разных окружений. Конфигуратор вполне счастливо проживёт и без этих файлов.
Vagrant
YiiBoilerplate содержит в себе инструментарий Vagrant, который вы можете использовать по своему усмотрению. Vagrantfile
настроен на использование образа precise64
, который представляет из себя чистый образ Ubuntu 12.04, подготовленный для Virtualbox.
Т.к. YiiBoilerplate это простейшее веб-приложение, мы подготовили набор скриптов для для развёртывания виртуальной машины Vagrant. Они находятся в папке carcass/vagrant
. Два скрипта для Vagrant можно использовать как примеры для автоматического развёртывания YiiBoilerplate на *nix системах:
prepare-precise64.sh
- этот скрипт устанавливает на Ubuntu 12.04 необходимый стек технологий для стандартного приложения с использованием базы данных: PHP 5.4, apache, mysql, git и т.д., а также создаёт саму базу данных.setup-app.sh
- скрипт установки приложения на подготовленную систему: создание файлов конфигурации, необходимых для работы приложения папок, а также удовлетворение всех зависимостей.
Вы можете самостоятельно их изучить, они ничуть не трудны для понимания.
Заметим, что в установке по умолчанию после каждой команды vagrant provision
необходимо дождаться завершения выполнения трёх вызовов apt-get update
. Это занимает достаточно много времени.
Чтобы избавиться от повторения этих долгих процедур, вы можете упаковать виртуальную машину, созданную после запуска vagrant up
в свой образ Vagrant и использовать его в дальнейшем вместо оригинального precise64
. В этом случае не забудьте удалить prepare-precise64.sh
из скриптов настройки окружения в Vagrantfile
.
Если из написанного выше вы не слова не поняли, приглашаем вас к изучению документации по vagrant box repackage
и документации по инициализации на сайте Vagrant.
Composer
Все сторонние компоненты YiiBoilerplate, включая собственно Yii, управляются с помощью Composer. Вы получаете Behat+Mink+MinkExtension, PHPUnit, полный набор инструментов для контроля качества кода PHP Quality Assurance toolchain, Phing, ApiGen, Yii и YiiBooster в качестве зависимостей. В Composer'е есть даже Selenium, поэтому он тоже будет установлен.
Использование Composer'а значительно уменьшает объём кода приложения, который необходимо хранить в репозитории. Чтобы быть уверенным в том, что у каждого разработчика команды установлены одинаковые версии сторонних приложений, Composer создаёт специальный файл composer.lock
, который можно закоммитить в репозиторий вместо всей папки vendor
. Содержимое этого файла в точности сообщает Composer'у какие версии приложений должны быть использоваться для данного приложения. В репозитории YiiBoilerplate есть такой файл, так что можно быть уверенным, что по крайней мере разработчикам удалось запустить шаблон приложения с использованием всех перечисленных инструментов.
composer.json
был настроен таким образом, чтобы все исполняемые файлы хранились в папке bin
.
Phing
Возможно вам понадобится система сборки вашего приложения, поэтому мы включили в YiiBoilerplate Phing. Разработанный нами управляющий скрипт для Phing позволяет получить полный набор отчётов о статусе вашего приложения.
Результат выполнения скрипта, запускаемого командой bin/phing
, был описан ранее.
Обратите внимание, что перечень папок с исходным кодом для каждого инструмента, используемого Phing'ом, описан в отдельном файле вида carcass/filesets.xml
. Все папки, исключённые из анализа, вам надо будет добавить вручную в основной сборочный файл. Также файл придётся обновить при изменении структуры проекта.
Yiic
Традиционное консольное приложение Yii было перенесено в папку bin
. Это было сделано в целях безопасности, чтобы использовалась только встроенная в YiiBoilerpalte консоль, т.к. Composer устанавливает все исполняемые файлы в одну и ту же папку.
Папка console
полностью предназначена для обслуживания точки входа в приложение через консоль. Поэтому, чтобы выполнить какую-либо команду, встроенную в консоль или определённую в console/commands
вашего приложения, необходимо запускать bin/yiic <command>
из корня приложения (вместе более короткой ./yiic
).
Мы думаем, что это вполне приемлемый компромисс.
Behat
В качестве движка приёмочных тестов мы использовали комбинацию Behat + Mink + MinkExtension поверх Selenium2.
Это на сегодняшний день пожалуй лучший набор инструментов для приёмочного тестирования приложений на PHP. Синтаксис тестов позволяет вам, вашим тестировщикам или даже клиентам, описывать приёмочные тесты на человеко-понятном языке. Selenium использует обычный браузер для работы с графическим пользовательским интерфейсом вашего приложения и делает это сумасшедше быстро, так что вам даже не надо пользоваться браузерами без графических оболочек (такими как phantomJS или Zombie).
Все необходимые настройки уже собраны в файле behat.yml
. Для вашего удобства он помещён в корневую папку, поэтому вы можете запускать Behat без необходимости указывать путь до файла конфигурации в командной строке. Необходимо сделать только разместить файл behat-local.yml
в корневую папку с кодом приложения, в котором надо определить непереносимые настройки: базовый URL для подклчючения Mink к вашему приложению. Если вы используете виртуальную машину Vagrant, инициализирующий скрипт сам поместит файл behat-local.yml
в нужное место. Можете взглянуть на файл carcass/vagrant/behat-local.yml
, чтобы понять что от вас требуется.
Если вы выполняли базовую установку с использованием Selenium, необходимо запустить скрипт bin/selenium
, который полностью займёт один терминал.
Все ваши тесты для пользовательской части приложения должны быть помещены в tests/specs/frontend
. Все они могут быть выполнены одной командой bin/behat -p frontend
.
Тесты для административной части должны быть в tests/specs/backend
. Они запускаются командой bin/behat -p backend
.
Оба набора описаний используют единый класс контекста, расположенный в tests/specs/contexts/FeatureContext.php
. Все шаги при тестировании должны быть описаны в этом файле. Обратите внимание, что класс FeatureContext
- это только точка старта, ничто не мешает вам настраивать приёмочные тесты так, как считаете нужным.
PHPUnit
Для модульного тестирования мы включили в зависимости Composer'а библиотеку PHPUnit. Его исполняемые файлы находятся с папке bin
, как и все остальные исполняемые файлы. По умолчанию все тесты выполняются пакетно, поэтому они должны работать быстро. Конфигурационный файл phpunit.xml
расположен в корневой папке с кодом, поэтому можно запускать тесты командой bin/phpunit
без необходимости указывать путь до файла настроек.
Файл настроек, включённый в YiiBoilerplate, не содержит никакого покрытия кода тестами. Чтобы определить это покрытие необходимо использовать одну из целей Phing под названием coverage
таким образом: bin/phing coverage
, в котором настройки покрытия кода указываются с использованием ключей командной строки.
Нашей целью было сделать инструмент для чисто модульного тестирования. Для интеграционного тестирования мы подготовили скрипт начальной загрузки PHPUnit, который выполняет общую инициализацию приложения YiiBoilerplate. Его настройки изложены в файле common/bootstrap.php
, который также содержит некоторые хитрости по аналогии с yiit.php
. Этот скрипт инициализации по сути является четвёртой точкой входа в приложение.
Получается, что когда вы выполняете команду:
bin/phpunit --bootstrap carcass/phpunit.bootstrap.php
вы выполняете все тест-кейсы в окружении, в котором определён класс Yii, а также произведена стандартная начальная настройка. Таким образом вы можете спокойно инициализировать веб-приложение так, как считаете нужным, и с любой конфигурацией тестов.
YiiBooster
Для административной части приложения мы включили в зависимости Composer'а другую нашу библиотеку: YiiBooster, а также добавили настройки, позволяющие подключить её к проекту.
Так что вы получаете весь функционал YiiBooster для разработки пользовательского интерфейса административной части вашего приложения. Возможности библиотеки подробно описаны в документации YiiBooster.
Пользовательская часть, напротив, представляет собой пустую страницу на основе HTML5Boilerplate. По нашему опыту пользовательская часть каждого веб-приложения абсолютно уникальна, поэтому мы считаем, что применять для её оформления стандартный Twitter Bootstrap не совсем уместно.
Лицензия
Весь код по умолчанию распространяется под лицензией BSD, как и все опен-сорс разработки Clevertech.
Так как со временем внутри шаблона всё может поменяться, можете считать, что он является общественным достоянием. Мы никак не ограничиваем изменения в YiiBoilerplate для ваших нужд.
Настройки phpStorm
Чтобы в полной мере использовать автодополнение в phpStorm, мы применили несколько хитростей для игнорирования некоторых сторонних библиотек.
-
Мы используем наш собственный класс
Yii
, чтобы задействовать кнопку F4 для вызоваYii::app()
. Однако это приводит к повторяющимся значениям параметров, на что phpStorm "ругается".- В меню
File -> Settings -> PHP
в секции Include Path найти запись, оканчивающуюся наyiisoft/yii
и заменить её наyiisoft/yii/framework
. - Аналогичным образом надо заменить
clevertech/yii-booster
наclevertech/yii-booster/src
. - В меню
File -> Settings -> File Types
в секции Ignore files and folders добавить (дословно) строку;framework/Yii.php;tests/fakes/Yii.php
.
- В меню
-
Кроме того, Behat, устанавливаемый через Composer, содержит класс
FeatureContext
, который конфликтует с нашим одноимённым классом. В менюFile -> Settings -> PHP
в секции Include Path надо найти запись, заканчивающуюся наbehat/behat
и добавить к нейsrc
. Это исключит код тестов из индекса Behat.
Обратите внимание, что из-за механизма индексации phpStorm вам надо будет либо менять пути PHP каждый раз после внесения изменений в composer.json
, либо отключить автоматическую переиндексацию всех установленных через Composer библиотек.
Замечание об использовании phpStorm для разработки приложений на базе Yii: если вы хотите, чтобы компоненты приложения были доступны по нажатию F4 на имени компонента в переменной, например как здесь: Yii::app()->request
, вам необходимо добавить блоки @property
в определение классов вашего приложения с указанием связи названия класса компонента и его идентификатора. Это также улучшает понимание кода человеком.