@tekord
Веб-разработчик

Как внедрить компонент через Yii::$container в конструктор класса?

Есть класс, который работает с БД. Экземпляр соединения БД передаётся через конструктор.

class UpdateStatsCommand extends Object {
	/**
	 * @var Connection
	 */
	protected $db;

	/**
	 * @inheritdoc
	 */
	public function __construct(Connection $db, array $config = []) {
		$this->db = $db;

		parent::__construct($config);
	}
    ...


Вопрос: как сделать так чтобы при инстанцировании этого класса через Yii::createObject(UpdateStatsCommand::class) в конструктор внедрялась ссылка на компонент приложения db?

Я пробовал добавить в bootstrap.php следующее:

Yii::$container->set(yii\db\Connection::class, function () {
	return Yii::$app->get('db');
});


Но при запуске приложение падает от переполнения памяти:

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted

Похоже это происходит из-за того, что при инициализации компонента db Yii находит в контейнере имя класса yii\db\Connection и пытается вызывать функцию, которая обращается к компоненту, а компонент не проинициализирован, соответственно начинается его инициализация и всё зацикливается.
  • Вопрос задан
  • 254 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы