simsoft / validator
A Laravel-inspired validation wrapper for Symfony Validator with custom rules, error handling, and validated input support.
3.0.2
2026-05-31 11:04 UTC
Requires
- php: >=8.4
- symfony/validator: ^8
Requires (Dev)
- phpunit/phpunit: ^11
This package is auto-updated.
Last update: 2026-05-31 11:07:49 UTC
README
A Laravel-inspired validation wrapper for Symfony Validator. Simple API, full power of Symfony constraints.
📖 Full Documentation
Requirements
- PHP >= 8.4
- Symfony Validator ^8
Installation
composer require simsoft/validator
Basic Usage
use Simsoft\Validator; use Simsoft\Validator\Rule; use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\Length; use Symfony\Component\Validator\Constraints\NotBlank; $validator = Validator::make($_POST, [ // bail: stops at first failure — only one error reported 'email' => Rule::bail([ new NotBlank(message: 'Email is required'), new Email(message: 'Invalid email'), ]), // array: runs all constraints — collects all errors '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'); }
Rule::bail() vs array rules:
Rule::bail([...])— 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 Simsoft\Validator\Rule; use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\NotBlank; class LoginValidator extends Validator { protected array $attributes = ['email', 'password', 'remember_me' => false]; protected function rules(): array { return [ 'email' => Rule::bail([ 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
📖 Read the Full Documentation
- Getting Started
- 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.