59 lines
2.1 KiB
PHP
59 lines
2.1 KiB
PHP
<?php
|
||
/**
|
||
* @package Bicycle
|
||
* @author Egor Isaev
|
||
* @description Database.php
|
||
* @copyright (c) 07/08/2026
|
||
*/
|
||
|
||
namespace Services;
|
||
|
||
use Services\DataBase\Classes\PdoDriver;
|
||
use System\Classes\Config;
|
||
use System\Classes\MyException;
|
||
|
||
/**
|
||
* Точка входа в реляционную БД. Имя аргумента — это имя подключения
|
||
* (ключ в Config::get('db', $name), по умолчанию 'default'), а не тип драйвера —
|
||
* сейчас есть только один драйвер ('pdo'), поэтому реестр по типу драйвера
|
||
* (как в Auth::$_drivers) не заводится, пока не появится второй.
|
||
*
|
||
* Database::instance()->query('SELECT ...');
|
||
* Database::instance('reporting')->query(...); // отдельное подключение
|
||
*/
|
||
class Database
|
||
{
|
||
/** @var array<string,PdoDriver> Кэш подключений по имени */
|
||
protected static array $_instances = [];
|
||
|
||
/**
|
||
* Возвращает подключение по имени (кэшируется).
|
||
*
|
||
* @param string|null $name Имя подключения из конфига; null — 'default'
|
||
* @return PdoDriver
|
||
* @throws MyException Если подключение не описано в конфиге или драйвер неизвестен
|
||
*/
|
||
public static function instance(?string $name = null): PdoDriver
|
||
{
|
||
$name ??= 'default';
|
||
|
||
if (!isset(self::$_instances[$name])) {
|
||
$config = Config::get('db', $name);
|
||
|
||
if ($config === null) {
|
||
throw new MyException('Подключение к БД не описано в конфиге: :name', [':name' => $name]);
|
||
}
|
||
|
||
if (($config['driver'] ?? null) !== 'pdo') {
|
||
throw new MyException(
|
||
'Неизвестный драйвер БД: :driver', [':driver' => $config['driver'] ?? 'null']
|
||
);
|
||
}
|
||
|
||
self::$_instances[$name] = new PdoDriver($config['connection'] ?? []);
|
||
}
|
||
|
||
return self::$_instances[$name];
|
||
}
|
||
}
|