cloud-castle / validator
Быстрый валидатор данных для PHP 8.1+: 20+ правил, точечная нотация и wildcard для вложенных полей, пользовательские правила и сообщения. Нулевые внешние зависимости.
Requires
- php: >=8.1
- ext-mbstring: *
Requires (Dev)
- deptrac/deptrac: ^3.0 || ^4.0
- ergebnis/composer-normalize: ^2.45
- friendsofphp/php-cs-fixer: ^3.75
- icanhazstring/composer-unused: ^0.9
- illuminate/translation: ^10.0
- illuminate/validation: ^10.0
- infection/infection: ^0.29 || ^0.33
- php-parallel-lint/php-parallel-lint: ^1.4
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12 || ^2.1
- phpstan/phpstan-deprecation-rules: ^1.2 || ^2.0
- phpstan/phpstan-phpunit: ^1.4 || ^2.0
- phpstan/phpstan-strict-rules: ^1.6 || ^2.0
- phpunit/phpunit: ^10.5 || ^11.5
- psalm/plugin-phpunit: ^0.19 || ^0.20
- rakit/validation: ^1.4
- rector/rector: ^1.2 || ^2.0
- respect/validation: ^2.3
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.12 || ^4.0
- vimeo/psalm: ^6.0
- vlucas/valitron: ^1.4
- webmozart/assert: ^1.11
This package is auto-updated.
Last update: 2026-07-30 06:10:17 UTC
README
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
CloudCastle Validator
Быстрый валидатор данных для PHP 8.1+: 20+ правил, точечная нотация и
*для вложенных и массивных полей, пользовательские правила и сообщения. Граница безопасности для недоверенного ввода. Нулевые внешние зависимости.
Установка
composer require cloud-castle/validator
Требуется PHP 8.1+.
Быстрый старт
<?php
use CloudCastle\Validator\Validator;
$validator = Validator::make($request, [
'name' => 'required|string|min:2|max:50',
'email' => 'required|email',
'age' => 'nullable|integer|between:0,150',
'role' => 'required|in:user,manager',
'items.*.price' => 'required|numeric|min:0', // валидация массива по wildcard
]);
if ($validator->fails()) {
foreach ($validator->errors() as $field => $messages) {
// $field => ['сообщение об ошибке', ...]
}
}
// Проверенные данные — только поля из правил (защита от лишних ключей).
$clean = $validator->validated();
// Пользовательское правило и сообщение.
Validator::extend('even', fn (mixed $v): bool => is_int($v) && $v % 2 === 0, 'Поле :attribute должно быть чётным.');
Возможности
- 20+ встроенных правил:
required,nullable,string,integer,numeric,boolean,array,min,max,between,size,email,url,ip,in,not_in,regex,alpha,alpha_num,digits,same,different. - Точечная нотация для вложенных полей (
user.email) и *wildcard `** для элементов массива (items.*.price`). - Пользовательские правила: замыкания (
extend) и классыRuleInterface. - Переопределение сообщений по ключу «поле.правило».
validated()возвращает только описанные правилами поля — лишние ключи (is_adminи т. п.) не проходят дальше.- Иммутабельный результат, карта ошибок «поле → список сообщений».
Сравнение с аналогами
Все таблицы ниже сгенерированы автоматически из честных сравнительных
тестов (benchmarks/compare.php) на ОДИНАКОВОЙ операции для всех аналогов,
PHP 8.1.34, без Xdebug.
1. Функциональность
| Возможность | 🏆 CloudCastle | rakit | illuminate | valitron | respect | manual¹ |
|---|---|---|---|---|---|---|
| 20+ встроенных правил из коробки | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Точечная нотация + wildcard для вложенных полей | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Пользовательские правила и сообщения | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Готов из коробки без транслятора/фабрики | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
| Нулевые внешние зависимости | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
| Всего | 🏆 5 | 🏆 5 | 3 | 4 | 3 | 2 |
2. Безопасность и корректность
| Свойство | 🏆 CloudCastle | rakit | illuminate | valitron | respect | manual¹ |
|---|---|---|---|---|---|---|
| Сбор ВСЕХ ошибок (не бросает исключение на первой) | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| Строгая проверка типов без «магического» приведения | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| Только объявленные поля в validated() (защита от mass-assignment) | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Готов из коробки без внешней конфигурации | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
| Нулевые внешние зависимости (меньше поверхность атаки) | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
| Всего | 🏆 5 | 🏆 5 | 3 | 3 | 2 | 3 |
3. Производительность
Валидация массива из 3 полей, 50 000 раз (минимум из 4).
| Решение | Время (мс) | Итог |
|---|---|---|
| manual¹ | 60 | базовый уровень (не библиотека) |
| 🏆 CloudCastle | 393 | быстрейшее среди библиотек |
| rakit | 1 086,8 | аналог |
| respect | 1 277,8 | аналог |
| valitron | 1 712,4 | аналог |
| illuminate | 3 846,3 | аналог |
4. Потребление памяти
Пик памяти на 50 000 валидаций (изолированный процесс, только целевая библиотека).
| Решение | Пиковая память (KB) | Итог |
|---|---|---|
| 🏆 CloudCastle | 7 065 | легчайшее среди библиотек |
| valitron | 7 065 | аналог |
| respect | 7 065 | аналог |
| manual¹ | 7 065 | базовый уровень (не библиотека) |
| illuminate | 8 945 | аналог |
| rakit | 10 087 | аналог |
¹ Базовый уровень (нативные вызовы/примитивы без полноты решения) показан для контекста и не претендует на победу среди библиотек-аналогов.
rakit/validation — сильный аналог: по набору возможностей и безопасности он на одном уровне с cloud-castle, но в ~2,8× медленнее и заметно тяжелее по памяти. illuminate/validation требует транслятор и фабрику и в разы медленнее. Ручная валидация (baseline) быстрее, но без правил, сообщений и вложенности. Память измеряется в изоляции.
Вывод: CloudCastle Validator — самый быстрый среди полнофункциональных валидаторов (в 2,8× быстрее rakit, в 10× быстрее illuminate) и самый лёгкий по памяти, с точечной нотацией, wildcard, пользовательскими правилами и сообщениями при нулевых внешних зависимостях.
Разработка
composer install
composer check # линтеры + статический анализ + тесты
composer fix # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci # полный CI-пайплайн локально
Полный список команд с описаниями: composer run-script --list.
Документация
- Репозиторий: https://gitverse.ru/cloud-castle/validator
- История изменений: CHANGELOG.md
- Как внести вклад: CONTRIBUTING.md
- Кодекс поведения: CODE_OF_CONDUCT.md
- Политика безопасности: SECURITY.md
Лицензия
MIT © CloudCastle (alex-4-17@yandex.ru)
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano