48 lines
1.4 KiB
PHP
48 lines
1.4 KiB
PHP
<?php
|
|
/**
|
|
* @package Bicycle
|
|
* @author Egor Isaev
|
|
* @description CurrencyRate.php
|
|
* @copyright (c) 15/08/2026
|
|
*/
|
|
|
|
namespace Services;
|
|
|
|
use Services\CurrencyRate\Client;
|
|
use System\Classes\Config;
|
|
use System\Classes\MyException;
|
|
|
|
/**
|
|
* Точка входа в курсы валют (ЦБ РФ). Имя аргумента — имя подключения
|
|
* (ключ в Config::get('currency_rate', $name), по умолчанию 'default').
|
|
*
|
|
* Services\CurrencyRate::instance()->rate('EUR'); // float|null
|
|
*/
|
|
class CurrencyRate
|
|
{
|
|
/** @var array<string,Client> Кэш клиентов по имени подключения */
|
|
protected static array $_instances = [];
|
|
|
|
/**
|
|
* @param string|null $name Имя подключения из конфига; null — 'default'
|
|
* @return Client
|
|
* @throws MyException Если подключение не описано в конфиге
|
|
*/
|
|
public static function instance(?string $name = null): Client
|
|
{
|
|
$name ??= 'default';
|
|
|
|
if (!isset(self::$_instances[$name])) {
|
|
$config = Config::get('currency_rate', $name);
|
|
|
|
if ($config === null) {
|
|
throw new MyException('Подключение currency_rate не описано в конфиге: :name', [':name' => $name]);
|
|
}
|
|
|
|
self::$_instances[$name] = new Client($config);
|
|
}
|
|
|
|
return self::$_instances[$name];
|
|
}
|
|
}
|