Bicycle/Services/Database.php
Egor Isaev 69ce89a695 dev
2026-08-11 17:05:39 +03:00

54 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\PdoConnection;
use System\Classes\Config;
use System\Classes\MyException;
/**
* Точка входа в реляционную БД. Имя аргумента — это имя подключения
* (ключ в Config::get('db', $name), по умолчанию 'default'). Подключение всегда через PDO —
* PDO не «драйвер» в смысле выбора между несколькими реализациями (это и есть сама обёртка
* над клиентской библиотекой конкретной СУБД, см. CLAUDE.md, раздел DataBase), поэтому в
* конфиге нет отдельного ключа под тип драйвера — только параметры подключения.
*
* Database::instance()->query('SELECT ...');
* Database::instance('reporting')->query(...); // отдельное подключение
*/
class Database
{
/** @var array<string,PdoConnection> Кэш подключений по имени */
protected static array $_instances = [];
/**
* Возвращает подключение по имени (кэшируется).
*
* @param string|null $name Имя подключения из конфига; null — 'default'
* @return PdoConnection
* @throws MyException Если подключение не описано в конфиге
*/
public static function instance(?string $name = null): PdoConnection
{
$name ??= 'default';
if (!isset(self::$_instances[$name])) {
$config = Config::get('db', $name);
if ($config === null) {
throw new MyException('Подключение к БД не описано в конфиге: :name', [':name' => $name]);
}
self::$_instances[$name] = new PdoConnection($config);
}
return self::$_instances[$name];
}
}