База данных · PPA

Подключение к БД

Параметры подключения живут в классе-конфиге DbConfig: драйвер, хост, база, учётные данные — всё из .env. Репозиторий ссылается на этот класс по имени, а соединение открывается лениво и берётся из пула.

База Cdo\Config\DbConfigЗначения из .env (DB_*)Пул PpaPoolTrait

Что такое конфиг подключения и зачем

Конфиг подключения — класс, описывающий, к какой БД и как подключаться.

Проблема. Если параметры подключения разбросаны по коду или захардкожены, их нельзя менять по окружениям (dev/prod), а секреты утекают в репозиторий. К тому же под нагрузкой открывать новое соединение на каждый запрос дорого.

Решение. Соберите параметры в один класс, читающий значения из .env, и привяжите к нему репозитории по имени класса. Соединения переиспользуются через пул. Об этом и раздел.

Класс конфигурации

Сгенерируйте конфиг командой make (флаг -D):

bash
php call make -D .Main   # → main/MainDbConfig.php

Каркас наследует DbConfig из CDO и читает параметры из окружения в setUp():

main/MainDbConfig.php
<?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 Пароль ''

Привязка репозитория

Репозиторий ссылается на конфиг по имени класса и задаёт таблицу. Минимум — два свойства:

main/UserRepository.php
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() собирает полное имя из схемы и таблицы:

php
// $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 для установки (повторяемо).
php
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

Дальше