Класс компонента Yii2 не загружает конфигурацию при создании экземпляра - PullRequest
0 голосов
/ 10 мая 2018

Я создал простой пользовательский компонент, который простирается от 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() конфигурация не устанавливает для свойства компонента hubspotApiKey значение hubspotApiKey в конфиге, поэтому, соответственно, я вижу это из своего брошенного исключения:

Неверная конфигурация - yii \ base \ InvalidConfigException

Ключ API Hubspot не может быть пустым.

Однако, если я вызову компонент следующим образом:

Yii::$app->hubspotDataManager

передает эту конфигурационную переменную в! Почему это? Какие дополнительные усилия я должен сделать, чтобы компонент загружал свои данные конфигурации приложения для стандартного создания класса? Я не могу найти ничего об этом конкретном сценарии в документации.

ПРИМЕЧАНИЕ. Использование последней версии Yii2 2.0.15.1 с использованием базового шаблона приложения.

1 Ответ

0 голосов
/ 10 мая 2018

Когда вы создаете экземпляр без использования локатора служб, конфигурация, конечно, не известна.

Поток такой, Yii::$app - это Сервисный Локатор. Он передаст конфигурацию контейнеру инжектора зависимостей Yii::$container.

Если вы хотите передать конфигурацию без использования Service Locator 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',
]);
...