Speak.Me Учить иностранные слова

Структура приложения Yii

Приложение в 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, т.е. сначала происходит событие контроллера, потом модуля и в конце приложения

Жизненный цикл приложения

  1. Входной скрипт загружает конфигурацию приложения в виде массива
  2. Входной скрипт создает экземпляр приложения
    1. вызывается preInit() для конфигурации некоторых свойств с высоким приоритетом
    2. регистрируется обработчик ошибок
    3. конфигурируются свойства приложения
    4. вызывается init()
    5. вызывается bootstrap()
  3. Входной скрипт вызывает yii\base\Application::run() для запуска приложения
    1. происходит EVENT_BEFORE_REQUEST
    2. обрабатывается запрос
      1. из запроса выделяются маршрут и параметры
      2. создается модуль, контроллер и action
      3. запускается action
    3. происходит EVENT_AFTER_REQUEST
    4. отправляется ответ пользователю
  4. Входной скрипт принимает от приложения финальный статус и завершает процесс

Компоненты приложения

Приложение является реализацией паттерна Service Locator. Они хранят в себе так называемые компоненты приложения, которые предоставляют различные сервисы для обработки запроса (например, urlManager отвечает за роутинг, db отвечает за работы с БД).

Компоненты имеют уникальный ID в рамках приложения. Получить доступ к компоненту можно м помощью выражения

Компоненты реализую паттрен синглтон: при первом обращении к компоненту создается его экземпляр, а при каждом последующем — возвращается этот же экземпляр.