组件
组件是 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时, 检查组件是否有过实例