Конфигурация
Всё, что описывает соединение и управляет им: базовые классы конфигурации и их
значения по умолчанию, инлайновые конструкторы Call, методы жизненного цикла,
общие для всех конфигов, реестр ConnectionPool и вспомогательные типы-значения
CDOStatement и CDOBind.
Иерархия классов конфигурации
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_path — CDO не применяет его
автоматически.
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
Конкретные конфиги, принимающие всё в конструкторе:
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[] |
Все зарегистрированные экземпляры конфигов |
$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 порождает для каждого
скаляра. Постройте её вручную, чтобы дать плейсхолдеру имя или разделить его между
условиями.
use Flytachi\Winter\Cdo\CDOBind;
$bind = new CDOBind('user_id', 42);
$bind->getName(); // ':user_id' (ведущее ':' добавляется, если опущено)
$bind->getValue(); // 42| Метод | Возвращает |
|---|---|
getName() |
имя плейсхолдера, всегда с префиксом : |
getValue() |
привязанное значение (любой тип PHP, принимаемый связывателем) |
Связанное
- Установка — первый конфиг, шаг за шагом
- Логирование и диагностика — логгер и проверки здоровья
- Привязка параметров — как
CDOStatementтипизирует значения - Построение условий —
CDOBindвQb