phpsoftbox / validator-db
Database-backed validation rules and contracts for PhpSoftBox Validator
Requires
- php: ^8.5
- phpsoftbox/database-lookup: ^1.0
- phpsoftbox/validator: ^1.0
Requires (Dev)
- phpsoftbox/cs-fixer: ^1.2.2
- phpunit/phpunit: ^13.3
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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