mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-01 03:26:36 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			293 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			293 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| Configurations
 | |
| ==============
 | |
| 
 | |
| Configurations are widely used in Yii when creating new objects or initializing existing objects.
 | |
| Configurations usually include the class name of the object being created, and a list of initial values
 | |
| that should be assigned to the object's [properties](concept-properties.md). Configurations may also include a list of
 | |
| handlers that should be attached to the object's [events](concept-events.md) and/or a list of
 | |
| [behaviors](concept-behaviors.md) that should also be attached to the object.
 | |
| 
 | |
| In the following, a configuration is used to create and initialize a database connection:
 | |
| 
 | |
| ```php
 | |
| $config = [
 | |
|     'class' => 'yii\db\Connection',
 | |
|     'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
 | |
|     'username' => 'root',
 | |
|     'password' => '',
 | |
|     'charset' => 'utf8',
 | |
| ];
 | |
| 
 | |
| $db = Yii::createObject($config);
 | |
| ```
 | |
| 
 | |
| The [[Yii::createObject()]] method takes a configuration array as its argument, and creates an object by instantiating
 | |
| the class named in the configuration. When the object is instantiated, the rest of the configuration
 | |
| will be used to initialize the object's properties, event handlers, and behaviors.
 | |
| 
 | |
| If you already have an object, you may use [[Yii::configure()]] to initialize the object's properties with
 | |
| a configuration array:
 | |
| 
 | |
| ```php
 | |
| Yii::configure($object, $config);
 | |
| ```
 | |
| 
 | |
| Note that, in this case, the configuration array should not contain a `class` element.
 | |
| 
 | |
| 
 | |
| ## Configuration Format <span id="configuration-format"></span>
 | |
| 
 | |
| The format of a configuration can be formally described as:
 | |
| 
 | |
| ```php
 | |
| [
 | |
|     'class' => 'ClassName',
 | |
|     'propertyName' => 'propertyValue',
 | |
|     'on eventName' => $eventHandler,
 | |
|     'as behaviorName' => $behaviorConfig,
 | |
| ]
 | |
| ```
 | |
| 
 | |
| where
 | |
| 
 | |
| * The `class` element specifies a fully qualified class name for the object being created.
 | |
| * The `propertyName` elements specify the initial values for the named property. The keys are the property names, and the
 | |
|   values are the corresponding initial values. Only public member variables and [properties](concept-properties.md)
 | |
|   defined by getters/setters can be configured.
 | |
| * The `on eventName` elements specify what handlers should be attached to the object's [events](concept-events.md).
 | |
|   Notice that the array keys are formed by prefixing event names with `on `. Please refer to
 | |
|   the [Events](concept-events.md) section for supported event handler formats.
 | |
| * The `as behaviorName` elements specify what [behaviors](concept-behaviors.md) should be attached to the object.
 | |
|   Notice that the array keys are formed by prefixing behavior names with `as `; the value, `$behaviorConfig`, represents
 | |
|   the configuration for creating a behavior, like a normal configuration  described here.
 | |
| 
 | |
| Below is an example showing a configuration with initial property values, event handlers, and behaviors:
 | |
| 
 | |
| ```php
 | |
| [
 | |
|     'class' => 'app\components\SearchEngine',
 | |
|     'apiKey' => 'xxxxxxxx',
 | |
|     'on search' => function ($event) {
 | |
|         Yii::info("Keyword searched: " . $event->keyword);
 | |
|     },
 | |
|     'as indexer' => [
 | |
|         'class' => 'app\components\IndexerBehavior',
 | |
|         // ... property init values ...
 | |
|     ],
 | |
| ]
 | |
| ```
 | |
| 
 | |
| 
 | |
| ## Using Configurations <span id="using-configurations"></span>
 | |
| 
 | |
| Configurations are used in many places in Yii. At the beginning of this section, we have shown how to 
 | |
| create an object according to a configuration by using [[Yii::createObject()]]. In this subsection, we will
 | |
| describe application configurations and widget configurations - two major usages of configurations.
 | |
| 
 | |
| 
 | |
| ### Application Configurations <span id="application-configurations"></span>
 | |
| 
 | |
| The configuration for an [application](structure-applications.md) is probably one of the most complex arrays in Yii.
 | |
| This is because the [[yii\web\Application|application]] class has a lot of configurable properties and events.
 | |
| More importantly, its [[yii\web\Application::components|components]] property can receive an array of configurations
 | |
| for creating components that are registered through the application. The following is an abstract from the application
 | |
| configuration file for the [Basic Project Template](start-installation.md).
 | |
| 
 | |
| ```php
 | |
| $config = [
 | |
|     'id' => 'basic',
 | |
|     'basePath' => dirname(__DIR__),
 | |
|     'extensions' => require __DIR__ . '/../vendor/yiisoft/extensions.php',
 | |
|     'components' => [
 | |
|         'cache' => [
 | |
|             'class' => 'yii\caching\FileCache',
 | |
|         ],
 | |
|         'mailer' => [
 | |
|             'class' => 'yii\symfonymailer\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',
 | |
|         ],
 | |
|     ],
 | |
| ];
 | |
| ```
 | |
| 
 | |
| The configuration does not have a `class` key. This is because it is used as follows in
 | |
| an [entry script](structure-entry-scripts.md), where the class name is already given,
 | |
| 
 | |
| ```php
 | |
| (new yii\web\Application($config))->run();
 | |
| ```
 | |
| 
 | |
| More details about configuring the `components` property of an application can be found
 | |
| in the [Applications](structure-applications.md) section and the [Service Locator](concept-service-locator.md) section.
 | |
| 
 | |
| Since version 2.0.11, the application configuration supports [Dependency Injection Container](concept-di-container.md)
 | |
| configuration using `container` property. For example:
 | |
| 
 | |
| ```php
 | |
| $config = [
 | |
|     'id' => 'basic',
 | |
|     'basePath' => dirname(__DIR__),
 | |
|     'extensions' => require __DIR__ . '/../vendor/yiisoft/extensions.php',
 | |
|     'container' => [
 | |
|         'definitions' => [
 | |
|             'yii\widgets\LinkPager' => ['maxButtonCount' => 5]
 | |
|         ],
 | |
|         'singletons' => [
 | |
|             // Dependency Injection Container singletons configuration
 | |
|         ]
 | |
|     ]
 | |
| ];
 | |
| ```
 | |
| 
 | |
| To know more about the possible values of `definitions` and `singletons` configuration arrays and real-life examples,
 | |
| please read [Advanced Practical Usage](concept-di-container.md#advanced-practical-usage) subsection of the
 | |
| [Dependency Injection Container](concept-di-container.md) article.
 | |
| 
 | |
| ### Widget Configurations <span id="widget-configurations"></span>
 | |
| 
 | |
| When using [widgets](structure-widgets.md), you often need to use configurations to customize the widget properties.
 | |
| Both of the [[yii\base\Widget::widget()]] and [[yii\base\Widget::begin()]] methods can be used to create
 | |
| a widget. They take a configuration array, like the following,
 | |
| 
 | |
| ```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],
 | |
|     ],
 | |
| ]);
 | |
| ```
 | |
| 
 | |
| The above code creates a `Menu` widget and initializes its `activateItems` property to be `false`.
 | |
| The `items` property is also configured with menu items to be displayed.
 | |
| 
 | |
| Note that because the class name is already given, the configuration array should NOT have the `class` key.
 | |
| 
 | |
| 
 | |
| ## Configuration Files <span id="configuration-files"></span>
 | |
| 
 | |
| When a configuration is very complex, a common practice is to store it in one or multiple PHP files, known as
 | |
| *configuration files*. A configuration file returns a PHP array representing the configuration.
 | |
| For example, you may keep an application configuration in a file named `web.php`, like the following,
 | |
| 
 | |
| ```php
 | |
| return [
 | |
|     'id' => 'basic',
 | |
|     'basePath' => dirname(__DIR__),
 | |
|     'extensions' => require __DIR__ . '/../vendor/yiisoft/extensions.php',
 | |
|     'components' => require __DIR__ . '/components.php',
 | |
| ];
 | |
| ```
 | |
| 
 | |
| Because the `components` configuration is complex too, you store it in a separate file called `components.php`
 | |
| and "require" this file in `web.php` as shown above. The content of `components.php` is as follows,
 | |
| 
 | |
| ```php
 | |
| return [
 | |
|     'cache' => [
 | |
|         'class' => 'yii\caching\FileCache',
 | |
|     ],
 | |
|     'mailer' => [
 | |
|         'class' => 'yii\symfonymailer\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',
 | |
|     ],
 | |
| ];
 | |
| ```
 | |
| 
 | |
| To get a configuration stored in a configuration file, simply "require" it, like the following:
 | |
| 
 | |
| ```php
 | |
| $config = require 'path/to/web.php';
 | |
| (new yii\web\Application($config))->run();
 | |
| ```
 | |
| 
 | |
| 
 | |
| ## Default Configurations <span id="default-configurations"></span>
 | |
| 
 | |
| The [[Yii::createObject()]] method is implemented based on a [dependency injection container](concept-di-container.md).
 | |
| It allows you to specify a set of the so-called *default configurations* which will be applied to ALL instances of
 | |
| the specified classes when they are being created using [[Yii::createObject()]]. The default configurations
 | |
| can be specified by calling `Yii::$container->set()` in the [bootstrapping](runtime-bootstrapping.md) code.
 | |
| 
 | |
| For example, if you want to customize [[yii\widgets\LinkPager]] so that ALL link pagers will show at most 5 page buttons
 | |
| (the default value is 10), you may use the following code to achieve this goal:
 | |
| 
 | |
| ```php
 | |
| \Yii::$container->set('yii\widgets\LinkPager', [
 | |
|     'maxButtonCount' => 5,
 | |
| ]);
 | |
| ```
 | |
| 
 | |
| Without using default configurations, you would have to configure `maxButtonCount` in every place where you use
 | |
| link pagers.
 | |
| 
 | |
| 
 | |
| ## Environment Constants <span id="environment-constants"></span>
 | |
| 
 | |
| Configurations often vary according to the environment in which an application runs. For example,
 | |
| in development environment, you may want to use a database named `mydb_dev`, while on production server
 | |
| you may want to use the `mydb_prod` database. To facilitate switching environments, Yii provides a constant
 | |
| named `YII_ENV` that you may define in the [entry script](structure-entry-scripts.md) of your application.
 | |
| For example,
 | |
| 
 | |
| ```php
 | |
| defined('YII_ENV') or define('YII_ENV', 'dev');
 | |
| ```
 | |
| 
 | |
| You may define `YII_ENV` as one of the following values:
 | |
| 
 | |
| - `prod`: production environment. The constant `YII_ENV_PROD` will evaluate as `true`.
 | |
|   This is the default value of `YII_ENV` if you do not define it.
 | |
| - `dev`: development environment. The constant `YII_ENV_DEV` will evaluate as `true`.
 | |
| - `test`: testing environment. The constant `YII_ENV_TEST` will evaluate as `true`.
 | |
| 
 | |
| With these environment constants, you may specify your configurations conditionally based on
 | |
| the current environment. For example, your application configuration may contain the following
 | |
| code to enable the [debug toolbar and debugger](tool-debugger.md) in development environment.
 | |
| 
 | |
| ```php
 | |
| $config = [...];
 | |
| 
 | |
| if (YII_ENV_DEV) {
 | |
|     // configuration adjustments for 'dev' environment
 | |
|     $config['bootstrap'][] = 'debug';
 | |
|     $config['modules']['debug'] = 'yii\debug\Module';
 | |
| }
 | |
| 
 | |
| return $config;
 | |
| ```
 | 
