Приложение ========== Объект приложения (application) инкапсулирует контекст выполнения запроса. Основная задача приложения — собрать информацию о запросе и передать её соответствующему контроллеру для дальнейшей обработки. Также приложение является централизованным хранилищем конфигурации приложения. Именно поэтому объект приложения также называют `фронт-контроллером`. Объект приложения создаётся [входным скриптом](/doc/guide/basics.entry) как `одиночка (singleton)`. Экземпляр приложения доступен из любой его точки посредством [Yii::app()|YiiBase::app]. Конфигурация приложения ----------------------- По умолчанию объект приложения — это экземпляр класса [CWebApplication], который может быть настроен с использованием конфигурационного файла (или массива). Необходимые значения свойств устанавливаются в момент создания экземпляра приложения. Альтернативный путь настройки приложения — расширение класса [CWebApplication]. Конфигурация — это массив пар ключ-значение, где каждый ключ представляет собой имя свойства экземпляра приложения, а значение — начальное значение соответствующего свойства. Например, следующая конфигурация устанавливает значения свойств приложения [name|CApplication::name] и [defaultController|CWebApplication::defaultController]: ~~~ [php] array( 'name'=>'Yii Framework', 'defaultController'=>'site', ) ~~~ Стоит отметить, что приложение, как и большинство классов Yii, [является компонентом](/doc/guide/basics.component). Это означает что: - Вы не можете присваивать значения не объявленным в классе свойствам. - Приложение поддерживает свойства, объявленные через геттеры и сеттеры, то есть можно сконфигурировать свойство, заданное [setImport|CModule::setImport] следующим образом: ~~~ [php] array( 'import'=>array( 'application.components.*', ), ) ~~~ Обычно конфигурация хранится в отдельном PHP-скрипте (например, `protected/config/main.php`). Скрипт возвращает конфигурационный массив: ~~~ [php] return array(…); ~~~ Чтобы воспользоваться конфигурацией, необходимо передать имя конфигурационного файла в качестве аргумента конструктору приложения или методу [Yii::createWebApplication()], как показано ниже. Обычно это делается во [входном скрипте](/doc/guide/basics.entry): ~~~ [php] $app=Yii::createWebApplication($configFile); ~~~ > Tip|Подсказка: Если конфигурация очень громоздкая, можно разделить ее на несколько файлов, каждый из которых возвращает часть конфигурационного массива. Затем в основном конфигурационном файле необходимо подключить эти файлы, используя `include()`, и соединить массивы-части в единый конфигурационный массив. Базовая директория приложения ----------------------------- Базовой директорией приложения называется корневая директория, содержащая все основные, с точки зрения безопасности, PHP-скрипты и данные. По умолчанию это поддиректория `protected`, находящаяся в директории, содержащей входной скрипт. Изменить её местоположение можно, установив свойство [basePath|CWebApplication::basePath] в [конфигурации приложения](/doc/guide/basics.application#application-configuration). Содержимое базовой директории должно быть закрыто от доступа из веб. При использовании веб-сервера [Apache HTTP server](http://httpd.apache.org/) это можно сделать путем добавления в базовую директорию файла `.htaccess` следующего содержания: ~~~ deny from all ~~~ Компоненты приложения --------------------- Функциональность объекта приложения может быть легко модифицирована и расширена благодаря компонентной архитектуре. Приложение управляет набором компонентов, каждый из которых реализует набор определённых возможностей. Например, приложение производит предварительную обработку запроса пользователя, используя компоненты [CUrlManager] и [CHttpRequest]. Изменяя значение свойства [components|CApplication::components], можно настроить классы и [значения свойств](/doc/guide/basics.component) любого компонента, используемого приложением. Например, можно сконфигурировать компонент [CMemCache] так, чтобы он использовал несколько memcache-серверов для кэширования: ~~~ [php] 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|CMemcache::servers]. Для доступа к компоненту приложения используйте `Yii::app()->ComponentID`, где `ComponentID` — это идентификатор компонента (например, `Yii::app()->cache`). Компонент может быть деактивирован путем установки параметра `enabled` в его конфигурации равным false. При обращении к деактивированному компоненту будет возвращен null. > Tip|Подсказка: По умолчанию компоненты приложения создаются по требованию. Это означает, что экземпляр компонента может быть не создан вообще в случае, если это не требуется при обработке пользовательского запроса. В результате общая производительность приложения может не пострадать, даже если в конфигурации указано множество компонентов. При необходимости обязательного создания экземпляров компонентов (например, [CLogRouter]) вне зависимости от того, используются они или нет, укажите их идентификаторы в значении конфигурационного свойства [preload|CApplication::preload]. Ключевые компоненты приложения ------------------------------ Yii предопределяет набор компонентов ядра, которые предоставляют возможности, необходимые для большинства веб-приложений. Например, компонент [request|CWebApplication::request] используется для сбора информации о запросе пользователя и предоставляет различную информацию, такую как URL и cookies. Задавая свойства компонентов, можно изменять стандартное поведение Yii практически как угодно. Далее перечислены ключевые компоненты, предопределенные классом [CWebApplication]: - [assetManager|CWebApplication::assetManager]: [CAssetManager] — управляет публикацией файлов ресурсов (asset files); - [authManager|CWebApplication::authManager]: [CAuthManager] — контролирует доступ на основе ролей (RBAC); - [cache|CApplication::cache]: [CCache] — предоставляет возможности кэширования данных; учтите, что вы должны указать используемый класс (например, [CMemCache], [CDbCache]), иначе при обращении к компоненту будет возвращен null; - [clientScript|CWebApplication::clientScript]: [CClientScript] — управляет клиентскими скриптами (JavaScript и CSS); - [coreMessages|CApplication::coreMessages]: [CPhpMessageSource] — предоставляет переводы системных сообщений Yii-фреймворка; - [db|CApplication::db]: [CDbConnection] — обслуживает соединение с базой данных; обратите внимание, что для использования компонента необходимо установить свойство [connectionString|CDbConnection::connectionString]; - [errorHandler|CApplication::errorHandler]: [CErrorHandler] — обрабатывает не пойманные ошибки и исключения PHP; - [format|CApplication::format]: [CFormatter] — форматирует данные для их последующего отображения. - [messages|CApplication::messages]: [CPhpMessageSource] — предоставляет переводы сообщений, используемых в Yii-приложении; - [request|CWebApplication::request]: [CHttpRequest] — содержит информацию о пользовательском запросе; - [securityManager|CApplication::securityManager]: [CSecurityManager] — предоставляет функции, связанные с безопасностью (например, хеширование, шифрование); - [session|CWebApplication::session]: [CHttpSession] — обеспечивает функциональность, связанную с сессиями; - [statePersister|CApplication::statePersister]: [CStatePersister] — предоставляет метод для сохранения глобального состояния; - [urlManager|CWebApplication::urlManager]: [CUrlManager] — предоставляет функции парсинга и формирования URL; - [user|CWebApplication::user]: [CWebUser] — предоставляет идентификационную информацию текущего пользователя; - [themeManager|CWebApplication::themeManager]: [CThemeManager] — управляет темами оформления. Жизненный цикл приложения ------------------------- Жизненный цикл приложения при обработке пользовательского запроса выглядит следующим образом: 0. Предварительная инициализация приложения через [CApplication::preinit()]. 1. Инициализация автозагрузчика классов и обработчика ошибок. 2. Регистрация компонентов ядра. 3. Загрузка конфигурации приложения. 4. Инициализация приложения [CApplication::init()]: - регистрация поведений приложения; - загрузка статических компонентов приложения. 5. Вызов события [onBeginRequest|CApplication::onBeginRequest]. 6. Обработка запроса: - сбор информации о запросе; - создание контроллера; - запуск контроллера. 7. Вызов события [onEndRequest|CApplication::onEndRequest].