我创建了一个从yii\base\Component
扩展的简单自定义组件。
namespace app\components\managers;
use yii\base\Component;
use yii\base\InvalidConfigException;
class HubspotDataManager extends Component
{
public $hubspotApiKey;
private $apiFactory;
public function init()
{
if (empty($this->hubspotApiKey)) {
throw new InvalidConfigException('Hubspot API Key cannot be empty.');
}
parent::init();
// initialise Hubspot factory instance after configuration is applied
$this->apiFactory = $this->getHubspotApiFactoryInstance();
}
public function getHubspotApiFactoryInstance()
{
return new \SevenShores\Hubspot\Factory([
'key' => $this->hubspotApiKey,
'oauth' => false, // default
'base_url' => 'https://api.hubapi.com' // default
]);
}
}
我已在config/web.php
应用程序配置中注册了该组件,我还在其中添加了自定义参数。
'components' => [
...
'hubspotDataManager' => [
'class' => app\components\managers\HubspotDataManager::class,
'hubspotApiKey' => 'mycustomkeystringhere',
],
...
],
但是,当我像这样实例化我的组件时,我发现:
$hubspot = new HubspotDataManager();
此hubspotApiKey
配置参数未传递到__construct($config = [])
- $config
只是一个空数组,因此在init()
中配置不会设置组件{{1在配置中属性hubspotApiKey
的值,因此我从抛出的异常中看到了这一点:
无效配置 - yii \ base \ InvalidConfigException
Hubspot API密钥不能为空。
但是,如果我像这样调用组件:
hubspotApiKey
它确实传递了这个配置变量!为什么是这样?为了让组件加载标准类实例化的应用程序配置数据,我必须做多少额外的工作?我在文档中找不到关于这个特定场景的任何内容。
注意:使用基本应用程序模板使用最新的Yii2版本Yii::$app->hubspotDataManager
。
答案 0 :(得分:2)
在不使用服务定位器的情况下创建实例时,配置当然是未知的。
流程是这样的,Yii::$app
是服务定位器。它会将配置传递给Dependency Injector containter Yii::$container
。
如果您想在不使用服务定位器Yii::$app
的情况下传递配置,您可以设置容器:
Yii::$container->set(app\components\managers\HubspotDataManager::class, [
'hubspotApiKey' => 'mycustomkeystringhere',
]);
和
$hubspot = Yii::$container->get(app\components\managers\HubspotDataManager::class);
结果与使用服务定位器Yii::$app
相同。
您也可以像这样实例化类的新实例,并将配置传递给它。
$hubspot = new HubspotDataManager([
'hubspotApiKey' => 'mycustomkeystringhere',
]);