simsoft / validator
A Laravel-inspired validation wrapper for Symfony Validator with custom rules, error handling, and validated input support.
3.0.1
2026-05-28 00:40 UTC
Requires
- php: >=8.4
- symfony/validator: ^8
Requires (Dev)
- phpunit/phpunit: ^11
This package is auto-updated.
Last update: 2026-05-28 02:04:49 UTC
README
A Laravel-inspired validation wrapper for Symfony Validator. Simple API, full power of Symfony constraints.
Requirements
- PHP >= 8.4
- Symfony Validator ^8
Installation
composer require simsoft/validator
Basic Usage
use Simsoft\Validator; use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\Length; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\Sequentially; $validator = Validator::make($_POST, [ 'email' => new Sequentially([ new NotBlank(message: 'Email is required'), new Email(message: 'Invalid email'), ]), 'password' => [ new NotBlank(message: 'Password is required'), new Length( min: 8, max: 20, minMessage: 'Minimum {{ limit }} characters are required', maxMessage: 'Maximum {{ limit }} characters exceeded', ), ], ]); if ($validator->passes()) { $data = $validator->validated(); } else { echo $validator->errors()->first('email'); }
Sequentially vs array rules:
new Sequentially([...])— stops at the first failing constraint ( short-circuit)[...](plain array) — runs all constraints and collects all violations
Retrieving Validated Data
$validated = $validator->validated(); // all validated data $email = $validator->validated('email'); // single attribute value $data = $validator->safe()->only(['email']); // subset of validated data $data = $validator->safe()->except(['remember_me']); // exclude specific keys foreach ($validator->safe() as $key => $value) { // iterate validated attributes }
Handling Errors
if ($validator->fails()) { echo $validator->errors()->first('email'); // first error for attribute $errors = $validator->errors()->all(); // all errors as an array $count = count($validator->errors()); // number of failed attributes if ($validator->errors()->has('email')) { // attribute has errors } foreach ($validator->errors()->get('email') as $message) { echo $message; // iterate attribute errors } foreach ($validator->errors() as $attribute => $messages) { // iterate all errors } }
Custom Validator Class
namespace App\Validators; use Simsoft\Validator; use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\Sequentially; class LoginValidator extends Validator { protected array $attributes = ['email', 'password', 'remember_me' => false]; protected function rules(): array { return [ 'email' => new Sequentially([ new NotBlank(message: 'Email is required'), new Email(message: 'Invalid email'), ]), 'password' => new NotBlank(message: 'Password is required'), ]; } }
$validator = LoginValidator::make($_POST); if ($validator->passes()) { $data = $validator->validated(); }
Documentation
For advanced features, see the full documentation:
- Custom Rules with Closures
- Reusable Custom Constraints
- Validation Groups
- Nested & Wildcard Array Validation
- Conditional & Optional Rules
- After Hooks & Cross-Field Validation
- Runtime Rules & Configuration
- Comparison with Other Validators
Available Constraints
All Symfony validation constraints are supported. See Symfony Validation Constraints.
License
MIT License. See LICENSE for details.