醉丶春风的Blog

千里之行, 始于足下



Yii2.0中动态管理组件components


组件

组件是 Yii 应用的主要基石。是 yii\base\Component 类或其子类的实例。 具有非常强大的功能, 我们的操作大部分都是通过内置组件实现的

组件默认为写入代码中的配置项, 在程序运行中, 当我们需要去控制组件时, 就需要动态的管理组件了, Yii提供了几种方法来设置组件

下面假设我们需要动态修改mailer组件, 从数据库中取出配置参数, 动态的去更新组件
默认在文件中配置是不支持取数据库的

1.获取组件

使用getComponents方法,该方法返回所有的组件信息, 该方法有个$returnDefinitions参数, 默认等于true, 返回所有组件的定义, 其实就是配置数组
如果将该参数设置为false, 则返回所有已有实例的组件
我们要重新配置组件的话, 则需要取组件的配置数组

$mailerParams = Yii::$app->getComponents()['mailer'];
print_r($mailerParams);
// 此处配置我已经在 common/config/main-local.php中配置过了, 默认没有这么多选项
/**
Array
(
    [class] => yii\swiftmailer\Mailer
    [viewPath] => @common/mail
    [useFileTransport] => 
    [transport] => Array
        (
            [class] => Swift_SmtpTransport
            [host] => smtp.qq.com
            [username] => shantongxu@qq.com
            [password] => 
            [port] => 465
            [encryption] => ssl
        )

    [messageConfig] => Array
        (
            [charset] => UTF-8
            [from] => Array
                (
                    [notifications@xstnet.com] => 徐善通的博客
                )

        )

)
**/
// 下面就可以从数据库中取配置信息了, 如密码

2.定义新的组件信息

// 假设 $mailerConfig = 数据库的查出的配置
$newMailerParams = [
    'transport' => [
        'host' => $mailConfig['email_host'],
        'username' => $mailConfig['email_username'],
        'password' => $mailConfig['email_password'],
        'port' => $mailConfig['email_port'],
        'encryption' => $mailConfig['email_encryption'],
    ],
    'messageConfig' => [
        'from' => ["{$mailConfig['email_from']}" => $mailConfig['email_from_title'],],
    ],
];

3.重新设置组件

通过上面两个步骤我们得到了原来的组件参数, 同时也设置了新的组件参数, 此时我们把新旧两个参数合二为一, 组成新的组件参数, 借助于\yii\helpers\ArrayHelper::merge方法

$newMailerParams = \yii\helpers\ArrayHelper::merge($mailerParams, $newMailerParams);

得到新的组件配置, 此时就可以向yii注册组件信息了,这里我们使用Yii::$app->set()方法

Yii::$app->set('mailer', $newMailerConfig);

set方法有两个参数, 第一个参数是组件的ID, 第二个参数是组件的配置信息数组
如果组件ID已存在,yii会自动销毁旧组件, 创建新的组件

使用 Yii::$app->setComponents()

setComponents适用于批量设置组件, 例如:

Yii::$app->setComponents([
    'mailer' => $newMailerConfig,
    //'db' => $dbConfig,
    //'cache' => $cacheConfig,
]);

使用 Yii::configure()

同样,使用Yii::configure也可达到目的,同时他还具有批量设置组件的功能
不仅如此, 他还具有为其他对象批量设置属性的功能

Yii::configure(Yii::$app, [
    'components' => [
        'mailer' => $newMailerConfig
    ]
]);

卸载组件

调用 clear方法即可, 将同时从组件定义, 组件实例中删除该组件

Yii::$app->clear('mailer');

has 方法

Yii::$app->has($id, $checkInstance = false)

  • 该方法用于检测是否有组件定义/是否有组件的实例
  • checkInstance为false时, 检查组件是否有定义
  • checkInstance为true时, 检查组件是否有过实例

作者: 徐善通
地址: https://www.xstnet.com/article-100.html
声明: 除非本文有注明出处,否则转载请注明本文地址


我有话说



最新回复


正在加载中....

Copyrights © 2016-2019 醉丶春风 , All rights reserved. 皖ICP备15015582号-1