Yii2组件类在实例化时未加载配置

时间:2018-05-10 13:39:54

标签: php configuration yii2 yii2-basic-app

我创建了一个从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

1 个答案:

答案 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',
]);