Пакет · cdo

Конфигурация

Всё, что описывает соединение и управляет им: базовые классы конфигурации и их значения по умолчанию, инлайновые конструкторы Call, методы жизненного цикла, общие для всех конфигов, реестр ConnectionPool и вспомогательные типы-значения CDOStatement и CDOBind.

Иерархия классов конфигурации

text
DbConfigInterface
└── BaseDbConfig (абстрактный) — жизненный цикл, проверки здоровья, логгер
  ├── PgDbConfig      (абстрактный) — умолчания PostgreSQL + schema/charset
  ├── MySqlDbConfig   (абстрактный) — умолчания MySQL/MariaDB + charset
  ├── DbConfig        (абстрактный) — явный $driver, без умолчаний
  └── Config\Call\
      ├── PgDbCall     — инлайновый PostgreSQL (аргументы конструктора)
      ├── MySqlDbCall  — инлайновый MySQL/MariaDB (аргументы конструктора)
      └── DbCall       — инлайновый общий (драйвер в конструкторе)

Наследуйте абстрактную базу и задавайте учётные данные в setUp(); используйте класс Call для разового соединения без определения подкласса.

PgDbConfig

Наследуйте для PostgreSQL. Свойства и умолчания:

Свойство Тип По умолчанию
host string 'localhost'
port int 5432
database string 'postgres'
username string 'postgres'
password string ''
schema string 'public'
charset `string\ null`

getDriver() возвращает 'pgsql'. charset, если задан, добавляет к DSN options='--client_encoding=…'. schema возвращается методом getSchema() для вышестоящих слоёв, задающих search_pathCDO не применяет его автоматически.

MySqlDbConfig

Наследуйте для MySQL или MariaDB:

Свойство Тип По умолчанию
host string 'localhost'
port int 3306
database string ''
username string 'root'
password string ''
charset `string\ null`

getDriver() возвращает 'mysql'; MariaDB определяется во время выполнения (см. Определение драйвера). charset добавляет к DSN charset=….

DbConfig

База, независимая от драйвера — вы сами задаёте $this->driver в setUp(), вместе с host, port, database, username, password. Умолчаний нет. Используйте её, когда нужен драйвер без выделенной базы.

Инлайновые классы Call

Конкретные конфиги, принимающие всё в конструкторе:

php
use Flytachi\Winter\Cdo\Config\Call\PgDbCall;
use Flytachi\Winter\Cdo\Config\Call\MySqlDbCall;
use Flytachi\Winter\Cdo\Config\Call\DbCall;

$pg = new PgDbCall(host: '127.0.0.1', database: 'myapp', username: 'postgres', password: 'secret');
$my = new MySqlDbCall(host: '127.0.0.1', database: 'myapp', username: 'root', password: 'secret', charset: 'utf8mb4');
$any = new DbCall(driver: 'mysql', host: '127.0.0.1', port: 3306, database: 'myapp', username: 'root', password: 'secret');

$cdo = $pg->connection();
  • PgDbCall / MySqlDbCall — все аргументы необязательны, откатываются к тем же умолчаниям, что и их абстрактные аналоги.
  • DbCall — все аргументы обязательны, включая driver.

Жизненный цикл соединения

Каждый конфиг (через BaseDbConfig) предоставляет:

Метод Возвращает Описание
setUp() void Загрузить учётные данные; вызывается пулом один раз
connect(int $timeout = 3) void Открыть лениво (no-op, если уже открыто)
connection() CDO Открыть при необходимости, вернуть CDO
disconnect() void Освободить ссылку на CDO
reconnect() void disconnect(), затем connect()
ping() bool Проверка доступности SELECT 1
pingDetail() array ['status', 'latency', 'error']
getSchema() `string\ null`
getLogger() / setLogger() LoggerInterface / void Доступ к PSR-3 логгеру
getDns() string Собранный DSN для PDO

Постоянные соединения выключены по умолчанию; задайте protected bool $isPersistent = true в подклассе, чтобы включить PDO::ATTR_PERSISTENT. Режим отладки (PDO::ERRMODE_EXCEPTION) включается, когда переменная окружения DEBUG истинна.

ConnectionPool

Реестр уровня процесса, создающий каждый конфиг один раз и возвращающий готовое соединение.

Метод Возвращает Описание
db(string $className) CDO Разрешить конфиг + вернуть живой CDO
getConfigDb(string $className, ?LoggerInterface $logger = null) DbConfigInterface Разрешить (и закешировать) конфиг; опционально подключить логгер при первом создании
showDbConfigs() DbConfigInterface[] Все зарегистрированные экземпляры конфигов
php
$cdo = ConnectionPool::db(AppDb::class);           // самое частое
$config = ConnectionPool::getConfigDb(AppDb::class); // для ping / reconnect

Аргумент $logger у getConfigDb() применяется только при первом вызове для данного класса; последующие вызовы возвращают закешированный экземпляр и игнорируют его.

CDOStatement

Типозависимая обёртка над PDOStatement, используемая внутри каждым методом DML. Её ключевой метод, bindTypedValue($param, $value), выбирает PDO-тип из gettype($value). Полная карта типов — в Привязке параметров.

Метод Описание
bindTypedValue($param, $value) Привязать с автоопределением PDO-типа
bindValue($param, $value, $type = PDO::PARAM_STR) Привязать с явным типом; записывает его
valObject(object $value) Сериализовать объект в скаляр (см. страницу о привязке)
getBindings() Записанные тройки [param, value, type]
updateStm(PDOStatement $stmt) Заменить statement и переиграть все привязки
getStmt() Обёрнутый PDOStatement (вызывайте на нём execute/fetch*)

CDOBind

Неизменяемая пара «имя + значение» — единица, которую Qb порождает для каждого скаляра. Постройте её вручную, чтобы дать плейсхолдеру имя или разделить его между условиями.

php
use Flytachi\Winter\Cdo\CDOBind;

$bind = new CDOBind('user_id', 42);
$bind->getName();  // ':user_id'  (ведущее ':' добавляется, если опущено)
$bind->getValue(); // 42
Метод Возвращает
getName() имя плейсхолдера, всегда с префиксом :
getValue() привязанное значение (любой тип PHP, принимаемый связывателем)

Связанное