Search by

phpsoftbox / validator-db

inspector-who

Database-backed validation rules and contracts for PhpSoftBox Validator

Package info

github.com/phpsoftbox/validator-db

pkg:composer/phpsoftbox/validator-db

Statistics

Installs: 277

Dependents: 1

Suggesters: 1

Stars: 0

Open Issues: 0

v1.0.0 2026-09-29 10:27 UTC

This package is auto-updated.

Last update: 2026-09-29 11:57:06 UTC


README

Контракты, правила и executors для интеграции phpsoftbox/validator с базой данных.

Установка

composer require phpsoftbox/validator-db

Adapter

Для одиночных проверок реализуйте DatabaseValidationAdapterInterface:

use PhpSoftBox\Validator\Db\Contracts\DatabaseValidationAdapterInterface;

final class DatabaseValidationAdapter implements DatabaseValidationAdapterInterface
{
    public function exists(string $table, array $criteria, ?string $connection = null): bool
    {
        // Проверка существования записи.
    }

    public function unique(
        string $table,
        array $criteria,
        ?string $connection = null,
        ?string $ignoreColumn = null,
        mixed $ignoreValue = null,
    ): bool {
        // Проверка уникальности записи.
    }
}

Для ExistsValidation::all() реализуйте DatabaseBulkValidationAdapterInterface и возвращайте ExistingValuesQueryInterface. Bulk-запрос получает LookupSpec, содержащий таблицу, lookup-column, список значений, дополнительные where-критерии и warmup key columns.

Регистрация executors

use PhpSoftBox\Validator\Db\Rule\Executor\ExistsRuleExecutor;
use PhpSoftBox\Validator\Db\Rule\Executor\UniqueRuleExecutor;
use PhpSoftBox\Validator\Db\Rule\ExistsValidation;
use PhpSoftBox\Validator\Db\Rule\UniqueValidation;
use PhpSoftBox\Validator\Rule\Executor\RuleExecutorRegistry;

$registry = new RuleExecutorRegistry([
    [ExistsValidation::class, new ExistsRuleExecutor($adapter)],
    [UniqueValidation::class, new UniqueRuleExecutor($adapter)],
]);

Передайте registry в PhpSoftBox\Validator\Validator.

Exists

ExistsValidation::make()
    ->table('users')
    ->column('email')
    ->where('active', true)
    ->connection('main');

Bulk-проверка всех значений:

use PhpSoftBox\DatabaseLookup\LookupSpec;

ExistsValidation::make()
    ->table('products')
    ->column('id')
    ->all(
        LookupSpec::forTable('products')
            ->lookupColumn('id')
            ->keyColumns('tenant_id', 'id'),
    )
    ->where('tenant_id', 10)
    ->warmup();

Unique

UniqueValidation::make()
    ->table('users')
    ->column('email')
    ->where('tenant_id', 10)
    ->ignore($userId)
    ->connection('main');

Колонка и scope

  • Без column() колонка — последний нечисловой сегмент пути поля: user.email → email, items.0.product_id → product_id. Имя попадает в текст SQL, поэтому допускается только идентификатор; иначе — InvalidArgumentException с просьбой указать column().
  • Условия LookupSpec (например, tenant_id) применяются и в одиночной проверке exists с lookup(), не только в all(). Явная column() вместе с lookup задаёт колонку поиска, а не игнорируется.
  • exists_all сравнивает числовые значения как числа ("01" найден, если БД вернула 1). Регистр и пробелы строк сравниваются как есть: правила сравнения в БД зависят от collation.

Breaking change

DB rules и executors перенесены из Validator. Старые namespace не поддерживаются:

PhpSoftBox\Validator\Rule\ExistsValidation
    → PhpSoftBox\Validator\Db\Rule\ExistsValidation

PhpSoftBox\Validator\Rule\UniqueValidation
    → PhpSoftBox\Validator\Db\Rule\UniqueValidation

PhpSoftBox\Validator\Rule\Executor\Database\ExistsRuleExecutor
    → PhpSoftBox\Validator\Db\Rule\Executor\ExistsRuleExecutor

PhpSoftBox\Validator\Rule\Executor\Database\UniqueRuleExecutor
    → PhpSoftBox\Validator\Db\Rule\Executor\UniqueRuleExecutor

Подробные примеры находятся в docs/exists-validation.md и docs/unique-validation.md.

Лицензия

MIT