53 lines
1.8 KiB
PHP
53 lines
1.8 KiB
PHP
<?php
|
||
/**
|
||
* @package Bicycle
|
||
* @author Egor Isaev
|
||
* @description Mongo.php
|
||
* @copyright (c) 07/08/2026
|
||
*/
|
||
|
||
namespace Services;
|
||
|
||
use Services\Mongo\MongoDriver;
|
||
use System\Classes\Config;
|
||
use System\Classes\MyException;
|
||
|
||
/**
|
||
* Точка входа в MongoDB. Имя аргумента — имя подключения
|
||
* (ключ в Config::get('mongo', $name), по умолчанию 'default').
|
||
*
|
||
* Требует ext-mongodb + composer-пакет mongodb/mongodb — но само по себе подключение
|
||
* этого файла и вызов instance() безопасны без расширения: реальная зависимость
|
||
* (new MongoDB\Client()) наступает только внутри MongoDriver, и только при первом
|
||
* реальном обращении (см. MongoDriver).
|
||
*
|
||
* Mongo::instance()->collection('logs')->insertOne([...]);
|
||
*/
|
||
class Mongo
|
||
{
|
||
/** @var array<string,MongoDriver> Кэш подключений по имени */
|
||
protected static array $_instances = [];
|
||
|
||
/**
|
||
* @param string|null $name Имя подключения из конфига; null — 'default'
|
||
* @return MongoDriver
|
||
* @throws MyException Если подключение не описано в конфиге
|
||
*/
|
||
public static function instance(?string $name = null): MongoDriver
|
||
{
|
||
$name ??= 'default';
|
||
|
||
if (!isset(self::$_instances[$name])) {
|
||
$config = Config::get('mongo', $name);
|
||
|
||
if ($config === null) {
|
||
throw new MyException('Подключение к MongoDB не описано в конфиге: :name', [':name' => $name]);
|
||
}
|
||
|
||
self::$_instances[$name] = new MongoDriver($config);
|
||
}
|
||
|
||
return self::$_instances[$name];
|
||
}
|
||
}
|