Подключение к БД
Параметры подключения живут в классе-конфиге DbConfig: драйвер, хост, база,
учётные данные — всё из .env. Репозиторий ссылается на этот класс по имени, а
соединение открывается лениво и берётся из пула.
Что такое конфиг подключения и зачем
Конфиг подключения — класс, описывающий, к какой БД и как подключаться.
Проблема. Если параметры подключения разбросаны по коду или захардкожены, их нельзя менять по окружениям (dev/prod), а секреты утекают в репозиторий. К тому же под нагрузкой открывать новое соединение на каждый запрос дорого.
Решение. Соберите параметры в один класс, читающий значения из .env, и
привяжите к нему репозитории по имени класса. Соединения переиспользуются через
пул. Об этом и раздел.
Класс конфигурации
Сгенерируйте конфиг командой make (флаг -D):
php call make -D .Main # → main/MainDbConfig.phpКаркас наследует DbConfig из CDO и читает параметры из окружения в setUp():
<?php
namespace Main;
use Flytachi\Winter\Cdo\Config\DbConfig;
use Flytachi\Winter\K2\Ppa\PpaCallTrait;
use Flytachi\Winter\K2\Ppa\Pool\PpaPoolConfigInterface;
use Flytachi\Winter\K2\Ppa\Pool\PpaPoolTrait;
class MainDbConfig extends DbConfig implements PpaPoolConfigInterface
{
use PpaCallTrait;
use PpaPoolTrait; // poolMaxConnections = 5, poolWaitTimeout = 3.0
public function setUp(): void
{
$this->driver = env('DB_DRIVER', 'pgsql');
$this->host = env('DB_HOST', 'localhost');
$this->port = env('DB_PORT', '5432');
$this->database = env('DB_NAME', 'postgres');
$this->username = env('DB_USER', 'postgres');
$this->password = env('DB_PASS', '');
}
}Переменные .env
| Переменная | Значение | По умолчанию |
|---|---|---|
DB_DRIVER |
Драйвер: pgsql, mysql… |
pgsql |
DB_HOST |
Хост БД | localhost |
DB_PORT |
Порт | 5432 |
DB_NAME |
Имя базы | postgres |
DB_USER |
Пользователь | postgres |
DB_PASS |
Пароль | '' |
Привязка репозитория
Репозиторий ссылается на конфиг по имени класса и задаёт таблицу. Минимум — два свойства:
class UserRepository extends Repository
{
protected string $dbConfigClassName = MainDbConfig::class; // обязательно
public static string $table = 'users'; // обязательно
protected string $entityClassName = User::class; // опц. (по умолч. stdClass)
protected ?string $schema = null; // опц. (по умолч. из конфига)
}Свойства репозитория
| Свойство | Тип | По умолчанию | Назначение |
|---|---|---|---|
$dbConfigClassName |
string |
— (обязательно) | FQCN конфига подключения. Без него конструктор бросит RepositoryException |
$table |
static string |
— (обязательно) | Имя таблицы без схемы |
$entityClassName |
string |
\stdClass |
Класс, в который гидрируются строки |
$schema |
?string |
null |
Схема; при null берётся из конфига |
Ленивое соединение
Соединение не открывается, пока не выполнится первый запрос — оно резолвится через пул. Объявление репозитория ничего не подключает.
Схема и имя таблицы
originTable() собирает полное имя из схемы и таблицы:
// $schema = 'public', $table = 'users' → 'public.users'
// $schema = null, $table = 'users' → 'users'
$repo->originTable();Свойство $schema в репозитории переопределяет схему из конфига — удобно, когда
одна таблица живёт в другой схеме (например, archive.users).
Пул соединений
Конфиг реализует PpaPoolConfigInterface и подключает PpaPoolTrait — это делает
подключение пуловым. Под FPM пул работает как синглтон на воркер, под Swoole — как
корутинный пул. Значения по умолчанию:
| Настройка | По умолчанию | Что задаёт |
|---|---|---|
poolMaxConnections |
5 |
Максимум соединений в пуле |
poolWaitTimeout |
3.0 |
Ожидание свободного соединения, сек |
Переопределяются в конфиге, если нужно другое поведение. Глубже про пул — в разделе Продвинутое и доках CDO.
Конфиг и миграции
Два атрибута на классе конфига управляют генерацией схемы командой db migrate:
#[Migratable]— включает конфиг (и его репозитории) в скан миграций. Без негоdb migrateмолча пропускает конфиг, даже если у сущностей есть#[Table].#[Extension('...')]— расширение PostgreSQL для установки (повторяемо).
use Flytachi\Winter\K2\Ppa\Mapping\Attributes\Config\Migratable;
use Flytachi\Winter\K2\Ppa\Mapping\Attributes\Config\Extension;
#[Migratable]
#[Extension('pgcrypto')]
class MainDbConfig extends DbConfig implements PpaPoolConfigInterface { /* ... */ }Полностью про миграции — на странице Миграции.
Справочник геттеров
| Метод | Возвращает |
|---|---|
getDbConfigClassName() |
Имя класса конфига |
getEntityClassName() |
Имя класса сущности |
getSchema() |
Активную схему или null |
originTable() |
'схема.таблица' / 'таблица' |
db() |
Активное соединение CDO |
Дальше
- Сущности — маппинг колонок и
$entityClassName - Конструктор запросов — запросы к таблице
- Миграции — генерация схемы из сущностей