Конфигурации ¶
Конфигурации широко используются в Yii при создании новых объектов или при инициализации уже существующих объектов. Обычно конфигурации включают в себя названия классов создаваемых объектов и список первоначальных значений, которые должны быть присвоены свойствам объекта. Также в конфигурациях можно указать список обработчиков событий объекта и/или список поведений объекта.
Пример конфигурации подключения к базе данных и дальнейшей инициализации подключения:
$config = [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
$db = Yii::createObject($config);
Метод Yii::createObject() принимает в качестве аргумента массив с конфигурацией и создаёт объект указанного в них класса. При этом оставшаяся часть конфигурации используется для инициализации свойств, обработчиков событий и поведений объекта.
Если объект уже создан, вы можете использовать Yii::configure() для того, чтобы инициализировать свойства объекта массивом с конфигурацией:
Yii::configure($object, $config);
Обратите внимание, что в этом случае массив с конфигурацией не должен содержать ключ class
.
Формат конфигурации ¶
Формат конфигурации выглядит следующим образом:
[
'class' => 'ClassName',
'propertyName' => 'propertyValue',
'on eventName' => $eventHandler,
'as behaviorName' => $behaviorConfig,
]
где
- Элемент
class
указывает абсолютное имя класса создаваемого объекта. - Элементы
propertyName
указывают первоначальные значения свойств создаваемого объекта. Ключи являются именами свойств создаваемого объекта, а значения — начальными значениями свойств создаваемого объекта. Таким способом могут быть установлены только публичные переменные объекта и его свойства, созданные через геттеры и сеттеры. - Элементы
on eventName
указывают на то, какие обработчики должны быть прикреплены к событиям объекта. Обратите внимание, что ключи массива начинаются сon
. Чтобы узнать весь список поддерживаемых видов обработчиков событий, обратитесь в раздел события - Элементы
as behaviorName
указывают на то, какие поведения должны быть внедрены в объект. Обратите внимание, что ключи массива начинаются сas
; а$behaviorConfig
представляет собой конфигурацию для создания поведения, похожую на все остальные конфигурации.
Пример конфигурации с установкой первоначальных значений свойств объекта, обработчика событий и поведения:
[
'class' => 'app\components\SearchEngine',
'apiKey' => 'xxxxxxxx',
'on search' => function ($event) {
Yii::info("Keyword searched: " . $event->keyword);
},
'as indexer' => [
'class' => 'app\components\IndexerBehavior',
// ... начальные значения свойств ...
],
]
Использование конфигурации ¶
Конфигурации повсеместно используются в Yii. В самом начале данной главы мы узнали как создать объект с необходимыми параметрами, используя метод Yii::createObject(). В данном разделе речь пойдет о конфигурации приложения и конфигурациях виджетов — двух основных способов использования конфигурации.
Конфигурация приложения ¶
Конфигурация приложения, пожалуй, самая сложная из используемых в фреймворке. Причина в том, что класс application содержит большое количество конфигурируемых свойств и событий. Более того, свойство приложения components может принимать массив с конфигурацией для создания компонентов, регистрируемых на уровне приложения. Пример конфигурации приложения для шаблона приложения basic.
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'extensions' => require __DIR__ . '/../vendor/yiisoft/extensions.php',
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
],
'log' => [
'class' => 'yii\log\Dispatcher',
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
],
],
],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=stay2',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
],
];
Ключ class
в данной конфигурации не указывается. Причина в том, что класс вызывается по полному имени во
входном скрипте:
(new yii\web\Application($config))->run();
За более подробной документацией о настройках свойства components
в конфигурации приложения обратитесь к главам
приложения и Service Locator.
Начиная с версии 2.0.11, можно настраивать контейнер зависимостей через конфигурацию
приложения. Для этого используется свойство container
:
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'extensions' => require __DIR__ . '/../vendor/yiisoft/extensions.php',
'container' => [
'definitions' => [
'yii\widgets\LinkPager' => ['maxButtonCount' => 5]
],
'singletons' => [
// Конфигурация для единожды создающихся объектов
]
]
];
Чтобы узнать о возможных значениях definitions
и singletons
, а также о реальных примерах использования,
прочитайте подраздел Более сложное практическое применение раздела
Контейнер внедрения зависимостей.
Конфигурации виджетов ¶
При использовании виджетов часто возникает необходимость изменить параметры виджета с помощью конфигурации. Для создания виджета можно использовать два метода: yii\base\Widget::widget() и yii\base\Widget::begin(). Оба метода принимают конфигурацию в виде PHP-массива:
use yii\widgets\Menu;
echo Menu::widget([
'activateItems' => false,
'items' => [
['label' => 'Home', 'url' => ['site/index']],
['label' => 'Products', 'url' => ['product/index']],
['label' => 'Login', 'url' => ['site/login'], 'visible' => Yii::$app->user->isGuest],
],
]);
Данный код создает виджет Menu
и устанавливает параметр виджета activeItems
в значение false
.
Также устанавливается параметр items
, состоящий из элементов меню.
Обратите внимание, что параметр class
НЕ передается, так как полное имя уже указано.
Конфигурационные файлы ¶
Если конфигурация очень сложная, то её, как правило, разделяют по нескольким PHP-файлам. Такие файлы называют
конфигурационными файлами. Конфигурационный файл возвращает массив PHP, являющийся конфигурацией.
Например, конфигурацию приложения можно хранить в отдельном файле web.php
, как показано ниже:
return [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'extensions' => require __DIR__ . '/../vendor/yiisoft/extensions.php',
'components' => require __DIR__ . '/components.php',
];
Параметр components
также имеет сложную конфигурацию, поэтому можно его хранить в файле components.php
и подключать в файл web.php
используя require
как и показано выше.
Содержимое файла components.php
:
return [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
],
'log' => [
'class' => 'yii\log\Dispatcher',
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
],
],
],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=stay2',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
];
Чтобы получить конфигурацию, хранящуюся в файле, достаточно подключить файл с помощью require
:
$config = require 'path/to/web.php';
(new yii\web\Application($config))->run();
Значения конфигурации по умолчанию ¶
Метод Yii::createObject() реализован с использованием контейнера внедрения зависимостей.
Это позволяет задавать так называемые значения конфигурации по умолчанию, которые будут применены ко ВСЕМ экземплярам классов во время их инициализации методом Yii::createObject(). Значения конфигурации по умолчанию указываются с помощью метода Yii::$container->set()
на этапе предварительной загрузки.
Например, если мы хотим изменить виджет yii\widgets\LinkPager так, чтобы все виджеты данного вида показывали максимум 5 кнопок на странице вместо 10 (как это установлено изначально), можно использовать следующий код:
\Yii::$container->set('yii\widgets\LinkPager', [
'maxButtonCount' => 5,
]);
Без использования значений конфигурации по умолчанию, при использовании LinkPager, вам пришлось бы каждый раз
задавать значение maxButtonCount
.
Константы окружения ¶
Конфигурации могут различаться в зависимости от режима, в котором происходит запуск приложения. Например,
в окружении разработчика (development) вы используете базу данных mydb_dev
, а в эксплуатационном (production) окружении
базу данных mydb_prod
. Для упрощения смены окружений в Yii существует константа YII_ENV
. Вы можете указать её во
входном скрипте своего приложения:
defined('YII_ENV') or define('YII_ENV', 'dev');
YII_ENV
может принимать следующие значения:
prod
: окружение production, т.е. эксплуатационный режим сервера. КонстантаYII_ENV_PROD
установлена вtrue
. Значение по умолчанию.dev
: окружение development, т.е. режим для разработки. КонстантаYII_ENV_DEV
установлена вtrue
.test
: окружение testing, т.е. режим для тестирования. КонстантаYII_ENV_TEST
установлена вtrue
.
Используя эти константы, вы можете задать в конфигурации значения параметров зависящие от текущего окружения. Например, чтобы включить отладочную панель и отладчик в режиме разработки, вы можете использовать следующий код в конфигурации приложения:
$config = [...];
if (YII_ENV_DEV) {
// значения параметров конфигурации для окружения разработки 'dev'
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module';
}
return $config;