Приложение в Yii представляет собой классическое MVC приложение. Но помимо привычных моделей, представлений и контроллеров в Yii приложении выделяются следующие части:
- входной скрипт — точка входа в приложение
- application — глобально доступный объект, управляющий всеми компонентами
- компоненты — зарегистрированный в приложении объекты, предоставляющие различные сервисы (функционал)
- модули — обособленные mvc приложения
- фильтры — код выполняемый до и после контроллера
- виджеты — встраиваются во вью, могут быть переиспользованы, могут содержать логику контроллеров (как хелперы и editorTemplate в asp)
Входной скрипт
Для веба — web/index.php, для консоли <root>yii.php. В входном скрипте выполняются следующие действия:
- объявляются константы
- загружается автозагрузчик
- загружается конфигурация
- загружается и запускается application
Application
Отдельный application для веба и консоли.
Конфигурация
Конфигурация загружается во входном скрипте с помощью require и передается в приложение при его запуске.
Конфигурация представляет собой ассоциативный массив. Содержится в отдельном файле/файлах в директории config проекта. console.php — для консольного приложения, web.php — для веб-приложения. Некоторые разделы выносятся в отдельные файлы (например, db.php — конфигурация соединения с бд) и включаются в основной с помощью require.
Конфигурация определяет (инициализирует) свойства приложения.
Свойства приложения
Обязательные (без них приложение не будет работать вообще)
- id — уникальный идентификатор приложения
- basePath — корневая директория приложения
Важные свойства (необходимы во многих случаях и уникальны для разных приложений)
- aliases — псевдонимы путей, определяются в виде ассоциативного массива, в котором ключи — псевдонимы, значения — пути
- bootstrap — массив компонентов, запускаемых при начальной загрузке приложения. Элементами массива могут id компонентов и модулей (строки), имена классов (строки), конфигурационные массивы, анонимные функции, создающие и возвращающие компонент. Подключение большого количества компонентов в этом свойстве может замедлить запуск приложения
- catchAll — указывается экшен, на который перенаправляются все запросы (полезно при тех обслуживании). Значением является массив, первый его элемент — роут для экшена, остальные — параметры передаваемые в экшен
- components — список зарегистрированных в приложении компонентов. Представляет собой ассоциативный массив: ключи — id компонентов, значения — имена классов компонентов или конфигурационные массивы. К зарегистрированным таким образом компонентам можно обратиться в любом месте приложения с помощью выражения \Yii::$app->componentID
- controllerMap — позволяет связать id контроллеров с произвольным классом контроллера в обход принятому соглашению
- controllerNamespace — пространство имен по умолчанию, в котором должны располагаться контроллеры
- language — язык приложения (многие компоненты используют это свойство)
- modules — модули приложения. Определяются так же как компоненты
- name — имя приложения (чисто в информативных целях)
- params — глобально доступные параметры в виде ассоциативного массива. Позволяет не хардкодить значения, а указать их в этой секции и затем в приложении обращаться к ним по имени (\Yii::$app->params[‘param_name’])
- sourceLanguage — язык исходного кода
- timeZone — временной пояс
- version — версия приложения
Полезные свойства (если не заданы, используются значения по умолчанию)
- charset — кодировка приложения (по умолчанию UTF-8)
- defaultRought — маршрут по умолчаню: будет использован если ни один другой не подойдет (по умолчанию ‘site’ для веб приложения и ‘help’ для консольного приложения
- extensions — список расширений, установленных и используемых приложением. По умолчанию это массив, возвращаемый файлом @vendor/yiisoft/extensions.php (генерируется автоматически composer’ом при установке расширений)
- layout — layout для view по умолчанию (по умолчанию ‘main’ относительно layoutPath: <root>/views/layouts/main.php). Можно поставить значение false и тогда view по умолчанию не будут использовать никакого layout’а
- layoutPath — путь для директории с layout’ами (по умолчанию ‘layouts’ относительно viewPath: <root>/views/layouts/)
- runtimePath — путь для директории с временными файлами: логи, кэш (по умолчанию ‘<root>/runtime’). Директория должна быть доступна для записи приложению, и защищена от доступа пользователей. Для удобства для нее предусмотрен псевдоним: @runtime
- viewPath — путь для директории view (по умолчанию ‘<root>/view’)
- vendorPath — путь для директории vendor: используется composer’ом для всех сторонних библиотек, включая Yii (по умолчанию, ‘<root>/vendor’). Предусмотрен специальный псевдоним — vendor
События приложения
В процессе жизненного цикла обработки запроса приложение генерирует различные события. В конфигурации можно назначить для этих событий обработчики. Задаются в виде ассоциативного массива, ключи — строки формата ‘on eventName’, значения — функции обработчики.
События:
- EVENT_BEFORE_REQUEST (beforeRequest) — происходит после инициализации приложения и загрузки в него конфигурации, но до начала обработки приложением запроса
- EVENT_AFTER_REQUEST (afterRequest) — происходит после того как приложение обработало запрос, но перед отправкой ответа. Компонент Response также генерирует свои события в процессе отправки ответа пользователю, эти события возникают после рассматриваемого события
- EVENT_BEFORE_ACTION (beforeAction) — происходит до выполнения action’а controller’а. В качестве параметра обработчику передается экземпляр yii\base\ActionEvent, и если обработчик установит его свойство yii\base\ActionEvent::$isValid в false, то action выполнен не будет. Модули и контроллеры также генериуют событие beforeAction. При этом сначала происходит событие приложения, затем модуля и наконец контроллера. Если в этой цепочке один из обработчиков устанвит свойство yii\base\ActionEvent::$isValid в false, остальные обработчики выполнены не будут
- EVENT_AFTER_ACTION (afterAction) — происходит после выполнения action’а. Ему также передается экземпляр yii\base\ActionEvent, а с помощью свойства yii\base\ActionEvent::$result можно изменить action result. Модули и контроллеры также генерируют событие afterAction, но в обратной последовательности по сравнению с beforeAction, т.е. сначала происходит событие контроллера, потом модуля и в конце приложения
Жизненный цикл приложения
- Входной скрипт загружает конфигурацию приложения в виде массива
- Входной скрипт создает экземпляр приложения
- вызывается preInit() для конфигурации некоторых свойств с высоким приоритетом
- регистрируется обработчик ошибок
- конфигурируются свойства приложения
- вызывается init()
- вызывается bootstrap()
- Входной скрипт вызывает yii\base\Application::run() для запуска приложения
- происходит EVENT_BEFORE_REQUEST
- обрабатывается запрос
- из запроса выделяются маршрут и параметры
- создается модуль, контроллер и action
- запускается action
- происходит EVENT_AFTER_REQUEST
- отправляется ответ пользователю
- Входной скрипт принимает от приложения финальный статус и завершает процесс
Компоненты приложения
Приложение является реализацией паттерна Service Locator. Они хранят в себе так называемые компоненты приложения, которые предоставляют различные сервисы для обработки запроса (например, urlManager отвечает за роутинг, db отвечает за работы с БД).
Компоненты имеют уникальный ID в рамках приложения. Получить доступ к компоненту можно м помощью выражения
1 | \Yii::$app->componentID |
Компоненты реализую паттрен синглтон: при первом обращении к компоненту создается его экземпляр, а при каждом последующем — возвращается этот же экземпляр.