2 关注者

配置

在创建新对象或初始化现有对象时,配置在 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
        ]
    ]
];

要了解有关 definitionssingletons 配置数组的可能值以及实际示例的更多信息,请阅读 高级实际用法 部分的 依赖注入容器 文章。

部件配置

在使用 部件 时,您经常需要使用配置来自定义部件属性。 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 属性初始化为 falseitems 属性也配置了要显示的菜单项。

注意,因为类名已经给出,所以配置数组不应包含 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 上编辑它 !