Задать вопрос
Express777
@Express777

Как синглтон превратить в DI в Yii2?

Есть обычный синглтон
class ApiClient
{
	private static $client = null;

	private static $url;

	private static $apiKey;

	private function __construct()
	{

	}

	/**
	 * Получить экземпляр для работы с АПИ
	 */
	public static function getInstance()
	{
		self::$url = \Yii::$app->params['api_url'];
		self::$apiKey = \Yii::$app->params['api_key'];
		
		if ( empty(self::$client) ) {
			self::$client = new BaseApiClient(self::$url, self::$apiKey);
		}

		return self::$client;
	}
}


Как превратить его или сделать так, чтобы вместо
$client = Api::getInstance();
писать
$client = \Yii::$app->getApi();

Заметьте, что url и apiKey берутся из $params, по сути из файлика, так сказать конфиг файл, чтобы можно было настройки разделить на дев и прод окружения
<?php
$params = [];

if ( YII_ENV_DEV || YII_ENV_TEST ) {
	$params['api_key'] = ..........
	$params['api_url'] = ..........
} else {
	$params['api_key'] =...............
	$params['api_url'] = ...............
}

return $params;
  • Вопрос задан
  • 1163 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
Decadal
@Decadal
А зачем вам делать его DI, сделайте его компонентом. Extends Component, а в конфигурации components=> [
'api'=> [ 'class' => 'namespace\вашего\клаccа']
]
Обращаться к нему так: Yii::$app->api.
Если что-то не понятно, спросите в комментарии, напишу развернуто.
Ответ написан
Комментировать
sanchezzzhak
@sanchezzzhak
Ля ля ля...
дополню ответ Decadal

вам тогда жужно его сделать как component

class BaseApiClient extend yii\base\Component {
      public $url;
      public $key
 }
если base класс не нужен лучше убрать если у вас нету фабрики клиентов, ну если еще таковой функционал нужен, то нужно будет сделать интерфейс.
class ApiClient extend BaseApiClient {
}


в конфиге config/web.php
в  секцию массива добавить components=> [
'api'=> [
 'class' => 'namespace\вашего\клаccа',
 'url' => '',
 'key' => '',
]
]


PS все объекты наследуемые от BaseObject или Component содержат функционал DI контейнер через конструктор
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы