concept-configurations.md 14.5 KB
Newer Older
1 2
Конфигурации
============
3

4 5 6
Конфигурации широко используются в Yii при создании новых объектов или при инициализации уже существующих объектов. 
Обычно конфигурации включают в себя названия классов создаваемых объектов и список первоначальных значений,
которые должны быть присвоены [свойствам](concept-properties.md) объекта. Также в конфигурациях можно указать список
7
[обработчиков событий](concept-events.md) объекта, и/или список [поведений](concept-behaviors.md) объекта.
8

9
Пример конфигурации подключения к базе данных и дальнейшей инициализации подключения: 
10 11 12 13 14 15 16 17 18 19 20 21 22

```php
$config = [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

$db = Yii::createObject($config);
```

23
Метод [[Yii::createObject()]] принимает в качестве аргумента массив с конфигурацией и создаёт объект указанного в них класса.
24
При этом оставшаяся часть конфигурации используется для инициализации свойств, обработчиков событий и поведений объекта.
25

26
Если объект уже создан, вы можете использовать [[Yii::configure()]] для того, чтобы инициализировать свойства объекта
27
массивом с конфигурацией:
28 29 30 31 32

```php
Yii::configure($object, $config);
```

33
Обратите внимание, что в этом случае массив с конфигурацией не должен содержать ключ `class`.
34 35


36
## Формат конфигурации <a name="configuration-format"></a>
37

38
Формат конфигурации выглядит следующим образом:
39 40 41 42 43 44 45 46 47 48 49 50

```php
[
    'class' => 'ClassName',
    'propertyName' => 'propertyValue',
    'on eventName' => $eventHandler,
    'as behaviorName' => $behaviorConfig,
]
```

где

51
* Элемент `class` указывает абсолютное имя класса создаваемого объекта.
52
* Элементы `propertyName` указывают первоначальные значения свойств создаваемого объекта. Ключи являются именами свойств
53 54 55
  создаваемого объекта, а значения — начальными значениями свойств создаваемого объекта.
  Таким способом могут быть установлены только публичные переменные объекта и его [свойства](concept-properties.md),
  созданные через геттеры и сеттеры.
56
* Элементы `on eventName` указывают на то, какие обработчики должны быть прикреплены к [событиям](concept-events.md) объекта.
57 58
  Обратите внимание, что ключи массива начинаются с `on `. Чтобы узнать весь список поддерживаемых видов
  обработчиков событий обратитесь в раздел [события](concept-events.md)
59 60 61
* Элементы `as behaviorName` указывают на то, какие [поведения](concept-behaviors.md) должны быть внедрены в объект.
  Обратите внимание, что ключи массива начинаются с `as `; а `$behaviorConfig` представляет собой конфигурацию для
  создания [поведения](concept-behaviors.md), похожую на все остальные конфигурации.
62

63
Пример конфигурации с установкой первоначальных значений свойств объекта, обработчика событий и поведения:
64 65 66 67 68 69 70 71 72 73

```php
[
    'class' => 'app\components\SearchEngine',
    'apiKey' => 'xxxxxxxx',
    'on search' => function ($event) {
        Yii::info("Keyword searched: " . $event->keyword);
    },
    'as indexer' => [
        'class' => 'app\components\IndexerBehavior',
74
        // ... начальные значения свойств ...
75 76 77 78 79
    ],
]
```


80
## Использование конфигурации <a name="using-configurations"></a>
81

82
Конфигурации повсеместно используются в Yii. В самом начале данной главы мы узнали как
83
создать объект с необходимыми параметрами используя метод [[Yii::createObject()]].
84 85
В данном разделе речь пойдет о конфигурации приложения и конфигурациях виджетов — двух основных способов
использования конфигурации. 
86 87


88
### Конфигурация приложения <a name="application-configurations"></a>
89

90 91
Конфигурация [приложения](structure-applications.md), пожалуй, самая сложная из используемых в фреймворке.
Причина в том, что класс [[yii\web\Application|application]] содержит большое количество конфигурируемых
92
свойств и событий. Более того, свойство приложения [[yii\web\Application::components|components]]
93 94
может принимать массив с конфигурацией для создания компонентов, регистрируемых на уровне приложения.
Пример конфигурации приложения для [шаблона приложения basic](start-basic.md).
95 96 97 98 99 100 101 102 103 104

```php
$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'extensions' => require(__DIR__ . '/../vendor/yiisoft/extensions.php'),
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
105
        'mailer' => [
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
            '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',
        ],
    ],
];
```

128
Ключ `class` в данной конфигурации не указывается. Причина в том, что класс вызывается по полному имени во
129
[входном скрипте](structure-entry-scripts.md):
130 131 132 133 134

```php
(new yii\web\Application($config))->run();
```

135
За более подробной документацией о настройках свойства `components` в конфигурации приложения обратитесь к главам
136
[приложения](structure-applications.md) и [Service Locator](concept-service-locator.md).
137 138


139
### Конфигурации виджетов <a name="widget-configurations"></a>
140 141

При использовании [виджетов](structure-widgets.md) часто возникает необходимость изменить параметры виджета с помощью
142 143
конфигурации. Для создания виджета можно использовать два метода: [[yii\base\Widget::widget()]] и 
[[yii\base\Widget::beginWidget()]]. Оба метода принимают конфигурацию в виде PHP массива:
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

```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`, состоящий из элементов меню.

161
Обратите внимание что параметр `class` НЕ передается, так как полное имя уже указано.
162 163


164
## Конфигурационные файлы <a name="configuration-files"></a>
165

166 167 168
Если конфигурация очень сложная, то её, как правило, разделяют по нескольким PHP файлам. Такие файлы называют
*Конфигурационными файлами*. Конфигурационный файл возвращает массив PHP являющийся конфигурацией.
Например, конфигурацию приложения можно хранить в отдельном файле `web.php`, как показано ниже:
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

```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`:

```php
return [
    'cache' => [
        'class' => 'yii\caching\FileCache',
    ],
188
    'mailer' => [
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
        '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',
    ],
];
```

210
Чтобы получить конфигурацию, хранящуюся в файле, достаточно подключить файл с помощью `require`:
211 212 213 214 215 216 217

```php
$config = require('path/to/web.php');
(new yii\web\Application($config))->run();
```


218
## Значения конфигурации по умолчанию <a name="default-configurations"></a>
219 220

Метод [[Yii::createObject()]] реализован с использованием [dependency injection container](concept-di-container.md).
221
Это позволяет задавать так называемые *значения конфигурации по умолчанию*, которые будут применены ко ВСЕМ экземплярам классов во время их инициализации методом [[Yii::createObject()]]. Значения конфигурации по умолчанию указываются с помощью метода `Yii::$container->set()` на этапе [предварительной загрузки](runtime-bootstrapping.md).
222

223 224
Например, если мы хотим изменить виджет [[yii\widgets\LinkPager]] так, чтобы все виджеты данного вида показывали максимум
5 кнопок на странице вместо 10 (как это установлено изначально), можно использовать следующий код:
225 226 227 228 229 230 231

```php
\Yii::$container->set('yii\widgets\LinkPager', [
    'maxButtonCount' => 5,
]);
```

232 233
Без использования значений конфигурации по умолчанию, при использовании LinkPager, вам пришлось бы каждый раз
задавать значение `maxButtonCount`.
234 235


236
## Константы окружения <a name="environment-constants"></a>
237

238 239 240
Конфигурации могут различаться в зависимости от режима, в котором происходит запуск приложения. Например,
в окружении разработчика (development) вы используете базу данных `mydb_dev`, а в эксплуатационном (production) окружении
базу данных `mydb_prod`. Для упрощения смены окружений в Yii существует константа `YII_ENV`.  Вы можете указать её во 
241
[входном скрипте](structure-entry-scripts.md) своего приложения:
242 243 244 245 246 247 248

```php
defined('YII_ENV') or define('YII_ENV', 'dev');
```

`YII_ENV` может принимать следующие значения:

249
- `prod`: окружение production, т.е. эксплуатационный режим сервера. Константа `YII_ENV_PROD` установлена в true.
250
   Значение по умолчанию.
251 252
- `dev`: окружение development, т.е. режим для разработки. Константа `YII_ENV_DEV` установлена в true.
- `test`: окружение testing, т.е. режим для тестирования. Константа `YII_ENV_TEST` установлена в true.
253

254 255 256
Используя эти константы, вы можете задать в конфигурации значения параметров зависящие от текущего окружения.
Например, чтобы включить [отладочную панель и отладчик](tool-debugger.md) в режиме разработки, вы можете использовать
следующий код в конфигурации приложения: 
257 258 259 260 261

```php
$config = [...];

if (YII_ENV_DEV) {
262
    // значения параметров конфигурации для окружения разработки 'dev'
263 264 265 266 267 268
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = 'yii\debug\Module';
}

return $config;
```