0 follower

Приложение

Приложение (application) — это контекст выполнения запроса. Основная задача приложения - предварительная обработка запроса (request resolving) пользователя и передача его соответствующему контроллеру для дальнейшей обработки. Другой задачей приложения является хранение параметров конфигурации уровня приложения (application-level configuration). Поэтому приложение также называют фронт-контроллером.

Приложение создается входным скриптом как одиночка (singleton). Экземпляр приложения доступен из любой его точки посредством Yii::app().

1. Конфигурация приложения

По умолчанию, приложение - это экземпляр класса CWebApplication, который может быть настроен с использованием конфигурационного файла (или массива). Необходимые значения свойств устанавливаются в момент создания экземпляра приложения. Альтернативный путь настройки приложения - расширение класса CWebApplication.

Конфигурация - это массив пар ключ-значение, где каждый ключ представляет собой имя свойства экземпляра приложения, а значение - начальное значение соответствующего свойства. Например, следующая конфигурация устанавливает значения свойств приложения name и defaultController:

array(
    'name'=>'Yii Framework',
    'defaultController'=>'site',
)

Обычно конфигурация хранится в отдельном PHP-скрипте (например, protected/config/main.php). Скрипт возвращает конфигурационный массив так:

return array(...);

Чтобы воспользоваться конфигурацией, необходимо передать имя конфигурационного файла как параметр конструктору приложения или классу Yii::createWebApplication(), как показано ниже. Обычно это делается во входном скрипте:

$app=Yii::createWebApplication($configFile);

Подсказка: Если конфигурация очень громоздкая, можно разделить ее на несколько файлов, каждый из которых возвращает часть конфигурационного массива. Затем, в основном конфигурационном файле, необходимо подключить эти файлы, используя include(), и слить массивы-части в единый конфигурационный массив.

2. Базовая директория приложения

Базовой директорией приложения называется корневая директория, содержащая все основные с точки зрения безопасности PHP-скрипты и данные. По умолчанию, это поддиректория с названием protected в директории, содержащей входной скрипт. Изменить местоположение можно изменив свойство basePath в конфигурации приложения.

Содержимое базовой директории должно быть закрыто от доступа из веб. При использовании веб-сервера Apache HTTP server, это можно сделать путем добавления в базовую директории файла .htaccess следующего содержания:

deny from all

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

Функциональность приложения может быть легко модифицирована и расширена благодаря компонентной архитектуре. Приложение управляет набором компонентов, каждый из которых имеет специфические возможности. Например, приложение производит предварительную обработку запроса пользователя, используя компоненты CUrlManager и CHttpRequest.

Изменяя значение свойства components, можно настроить классы и значения свойств любого компонента, используемого приложением. Например, можно сконфигурировать компонент CMemCache так, чтобы он использовал несколько memcache-серверов для кэширования:

array(
    ......
    'components'=>array(
        ......
        'cache'=>array(
            'class'=>'CMemCache',
            'servers'=>array(
                array('host'=>'server1', 'port'=>11211, 'weight'=>60),
                array('host'=>'server2', 'port'=>11211, 'weight'=>40),
            ),
        ),
    ),
)

В данном примере мы добавили элемент cache к массиву components. Элемент cache указывает, что классом компонента является CMemCache, а также устанавливает его свойство servers.

Для доступа к компоненту приложения используйте Yii::app()->ComponentID, где ComponentID - это идентификатор компонента (например, Yii::app()->cache).

Компонент может быть деактивирован путем установки параметра enabled в его конфигурации равным false. При обращении к деактивированному компоненту будет возвращен null.

Подсказка: По умолчанию, компоненты приложения создаются по требованию. Это означает, что экземпляр компонента может быть не создан вообще, в случае, если это не требуется при обработке пользовательского запроса. Как результат - общая производительность приложения не пострадает, даже если конфигурация приложения включает множество компонентов.

При необходимости обязательного создания экземпляров компонентов (например, CLogRouter) вне зависимости от того, используются они или нет, укажите их идентификаторы в значении конфигурационного свойства preload.

4. Ключевые компоненты приложения

Yii предопределяет набор ключевых (core) компонентов, которые предоставляют возможности, необходимые для большинства веб-приложений. Например, компонент request используется для предварительной обработки (resolve) запросов пользователя и предоставления различной информации, такой как URL, cookies. Задавая свойства ключевых компонентов, можно изменять стандартное поведение Yii практически как угодно.

Далее перечислены ключевые компоненты, предопределенные классом CWebApplication:

  • assetManager: CAssetManager - управляет публикацией файлов ресурсов (asset files);

  • authManager: CAuthManager - контролирует доступ на основе ролей (RBAC);

  • cache: CCache - предоставляет возможности кэширования данных; учтите, что вы должны указать используемый класс (например, CMemCache, CDbCache), иначе при обращении к компоненту будет возвращен null;

  • clientScript: CClientScript - управляет клиентскими скриптами (javascripts и CSS);

  • coreMessages: CPhpMessageSource - предоставляет переводы системных сообщений Yii-фреймворка;

  • db: CDbConnection - обслуживает соединение с базой данных; обратите внимание, что для использования компонента необходимо установить свойство connectionString;

  • errorHandler: CErrorHandler - обрабатывает непойманные ошибки и исключения PHP;

  • messages: CPhpMessageSource - предоставляет переводы сообщений, используемых в Yii-приложении;

  • request: CHttpRequest - предоставляет информацию, относящуюся к пользовательскому запросу;

  • securityManager: CSecurityManager - предоставляет функции, связанные с безопасностью (например, хеширование, шифрование);

  • session: CHttpSession - обеспечивает функциональность, связанную с сессиями;

  • statePersister: CStatePersister - предоставляет метод для сохранения глобального состояния;

  • urlManager: CUrlManager - предоставляет функции парсинга и формирования URL;

  • user: CWebUser - предоставляет идентификационную информацию текущего пользователя;

  • themeManager: CThemeManager - управляет темами оформления.

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

Жизненный цикл приложения при обработке пользовательского запроса:

  1. предварительная инициализация приложения посредством CApplication::preinit();

  2. установка автозагрузчика класса и обработку ошибок;

  3. регистрация ключевых компонентов приложения;

  4. загрузка конфигурации приложения;

  5. инициализация приложения CApplication::init():

    • регистрация поведений приложения;
    • загрузка статических компонентов приложения;
  6. вызов события onBeginRequest;

  7. обработка пользовательского запроса:

    • предварительная обработка (resolve) пользовательского запроса;
    • создание контроллера;
    • запуск контроллера на исполнение;
  8. вызов события onEndRequest.