在创建新对象或初始化现有对象时,配置在 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
元素指定命名属性的初始值。键是属性名称,值是相应的初始值。只有公共成员变量和由 getter/setter 定义的属性可以被配置。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',
// ... property init values ...
],
]
配置在 Yii 的许多地方使用。在本节开头,我们已经展示了如何使用 Yii::createObject() 根据配置创建对象。在本小节中,我们将描述应用程序配置和部件配置 - 配置的两种主要用法。
对于 应用程序 的配置,可能是 Yii 中最复杂的数组之一。这是因为 应用程序 类有很多可配置的属性和事件。更重要的是,它的 组件 属性可以接收一个数组,用于创建通过应用程序注册的组件。以下是 基本项目模板 的应用程序配置文件的摘录。
$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',
],
],
];
该配置没有 class
键。这是因为它在 入口脚本 中按如下方式使用,其中类名已经给出,
(new yii\web\Application($config))->run();
有关配置应用程序的 components
属性的更多详细信息,请参阅 应用程序 部分和 服务定位器 部分。
从 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' => [
// Dependency Injection Container singletons configuration
]
]
];
要了解有关 definitions
和 singletons
配置数组的可能值以及实际示例的更多信息,请阅读 高级实际用法 部分的 依赖注入容器 文章。
在使用 部件 时,您经常需要使用配置来自定义部件属性。 yii\base\Widget::widget() 和 yii\base\Widget::begin() 方法都可以用于创建部件。它们接受一个配置数组,如下所示,
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
部件,并将它的 activateItems
属性初始化为 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\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',
],
];
要获取存储在配置文件中的配置,只需“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,
]);
如果不使用默认配置,您将不得不为每个使用链接分页器的地方配置 maxButtonCount
。
配置通常会根据应用程序运行的环境而有所不同。例如,在开发环境中,您可能想要使用名为 mydb_dev
的数据库,而在生产服务器上,您可能想要使用 mydb_prod
数据库。为了便于切换环境,Yii 提供了一个名为 YII_ENV
的常量,您可以在应用程序的 入口脚本 中定义它。例如,
defined('YII_ENV') or define('YII_ENV', 'dev');
您可以将 YII_ENV
定义为以下值之一
prod
:生产环境。常量 YII_ENV_PROD
将评估为 true
。这是如果您没有定义 YII_ENV
的默认值。dev
:开发环境。常量 YII_ENV_DEV
将评估为 true
。test
:测试环境。常量 YII_ENV_TEST
将评估为 true
。使用这些环境常量,您可以根据当前环境有条件地指定您的配置。例如,您的应用程序配置可能包含以下代码,以在开发环境中启用 调试工具栏和调试器。
$config = [...];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module';
}
return $config;
发现错误或您认为此页面需要改进?
在 GitHub 上编辑它 !
注册 或 登录 以发表评论。