Bicycle/Services/Elasticsearch.php
Egor Isaev 9d4edf147a dev
2026-08-07 11:40:03 +03:00

48 lines
1.4 KiB
PHP

<?php
/**
* @package Bicycle
* @author Egor Isaev
* @description Elasticsearch.php
* @copyright (c) 07/08/2026
*/
namespace Services;
use Services\Elasticsearch\Client;
use System\Classes\Config;
use System\Classes\MyException;
/**
* Точка входа в Elasticsearch. Имя аргумента — имя подключения
* (ключ в Config::get('elasticsearch', $name), по умолчанию 'default').
*
* Elasticsearch::instance()->search('logs', ['query' => ['match_all' => new stdClass()]]);
*/
class Elasticsearch
{
/** @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('elasticsearch', $name);
if ($config === null) {
throw new MyException('Подключение к Elasticsearch не описано в конфиге: :name', [':name' => $name]);
}
self::$_instances[$name] = new Client($config);
}
return self::$_instances[$name];
}
}