Пакет · cdo

Установка и требования

Что нужно установить, какое расширение PDO-драйвера включить для вашей базы данных и единственный класс конфигурации, превращающий учётные данные в живое соединение CDO.

Требования

  • PHP ≥ 8.3
  • ext-pdo — ядро PDO
  • psr/log ^3.0 — для интерфейса логгера (устанавливается Composer автоматически)

Плюс расширение PDO-драйвера для той базы, к которой вы подключаетесь:

База данных Расширение PHP Что возвращает getDriver()
PostgreSQL pdo_pgsql pgsql
MySQL / MariaDB pdo_mysql mysql
Oracle pdo_oci oci

Проверить, какие драйверы включены:

bash
php -m | grep pdo

MySQL против MariaDB

Для обеих используется одно расширение pdo_mysql. CDO различает их во время выполнения по строке версии сервера, потому что MariaDB поддерживает INSERT ... RETURNING, а MySQL — нет; см. Определение драйвера.

Установка

bash
composer require flytachi/winter-cdo

Пакет автозагружается в пространстве имён Flytachi\\Winter\\Cdo\\ (PSR-4).

Определите класс конфигурации

Класс конфигурации описывает одно соединение. Наследуйте базу для вашей базы данных и заполните учётные данные внутри setUp() — он вызывается один раз, сразу после создания объекта.

app/Db/AppDb.php
<?php

namespace App\Db;

use Flytachi\Winter\Cdo\Config\PgDbConfig;

class AppDb extends PgDbConfig
{
  public function setUp(): void
  {
      $this->host     = getenv('DB_HOST') ?: 'localhost';
      $this->port     = (int) (getenv('DB_PORT') ?: 5432);
      $this->database = getenv('DB_NAME') ?: 'myapp';
      $this->username = getenv('DB_USER') ?: 'postgres';
      $this->password = getenv('DB_PASS') ?: '';
  }
}

Для MySQL/MariaDB наследуйте MySqlDbConfig (порт по умолчанию 3306). Полный список баз конфигурации, их значений по умолчанию и инлайновых конструкторов PgDbCall / MySqlDbCall / DbCall — в Справочнике по конфигурации.

Режим отладки

Задайте переменной окружения DEBUG истинное значение, чтобы открывать соединения с PDO::ERRMODE_EXCEPTION. CDO и так превращает сбои в CDOException, поэтому это полезно в основном при разработке.

Получите соединение

ConnectionPool создаёт каждый конфиг один раз за процесс и возвращает живой CDO:

php
use Flytachi\Winter\Cdo\ConnectionPool;
use App\Db\AppDb;

$cdo = ConnectionPool::db(AppDb::class);

Проверьте, что всё работает

ping() выполняет SELECT 1 и возвращает булево; pingDetail() добавляет задержку:

php
$config = ConnectionPool::getConfigDb(AppDb::class);

var_dump($config->ping());        // bool
print_r($config->pingDetail());   // ['status' => bool, 'latency' => float|null, 'error' => string|null]

Дальше