Контейнер Yii2 DI: регистрация одного и того же класса дважды, но с разными параметрами конструктора - PullRequest
0 голосов
/ 13 декабря 2018

В моем проекте я использую встроенный контейнер ввода зависимостей Yii2, который устанавливается в файле начальной загрузки приложения.Чего я хочу добиться, так это внедрить один и тот же класс дважды, но с разными параметрами конструктора:

Yii::$container->set(
    'common\components\ElasticSearchClient',
    [],
    [$elasticSearchServer1Params]
);

Yii::$container->set(
    'common\components\ElasticSearchClient',
    [],
    [$elasticSearchServer2Params]
);

Позже эти объекты класса клиента эластичного поиска должны автоматически вводиться в другие классы следующим образом:

class SomeClass1
{
    /**
     * @var ElasticSearch
     */
    protected $elasticSearchClient1;

    public function __construct(\common\components\ElasticSearchClient $elasticSearchClient1) {
        $this->elasticSearchClient1 = $elasticSearchClient1;
    }
}

class SomeClass2
{
    /**
     * @var ElasticSearch
     */
    protected $elasticSearchClient2;

    public function __construct(\common\components\ElasticSearchClient $elasticSearchClient2) {
        $this->elasticSearchClient2 = $elasticSearchClient2;
    }
}

Так можно ли это сделать?Должен ли я использовать псевдонимы контейнера DI как-то?

1 Ответ

0 голосов
/ 13 декабря 2018

Вы должны использовать псевдонимы для компонентов в контейнере для инъекций зависимости.Например:

Добавить компонент в контейнер DI:

Yii::$container->set(
    'component1',
    [
        'class' => '\common\components\ElasticSearchClient'
    ],
    [$elasticSearchServer1Params]    
);

Получить компонент из контейнера DI

$component = Yii::container->get('component1');
$someObject = new SomeClass1($component);

Но более ясный способ решения этой задачи -регистрация одного компонента ElasticSearchClient и его конфигурации перед созданием SomeClass

// add the component to the container
Yii::$container->set(
    'common\components\ElasticSearchClient',
);

// get the component from container and configure it
Yii::$container->get('common\components\ElasticSearchClient', 
                     [], 
                     [$elasticSearchServer1Params]
);
$someObject = new SomeClass1($component);

Кроме того, вы можете зарегистрировать SomeClass1 и SomeClass2 в контейнере DI для упрощения их создания.

$container->set('SomeClass1', function ($container, $params, $config) {
    $searchClient = $contaier->get('common\components\ElasticSearchClient',
                                   [], 
                                   [$elasticSearchServer1Params]
    );
    return new SomeClass1($searchClient);
});

$container->set('SomeClass2', function ($container, $params, $config) {
    $searchClient = $contaier->get('common\components\ElasticSearchClient',
                                   [], 
                                   [$elasticSearchServer2Params]
    );
    return new SomeClass2($searchClient);;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...