simsoft/validator

A Laravel-inspired validation wrapper for Symfony Validator with custom rules, error handling, and validated input support.

Maintainers

Package info

github.com/sim-soft/validator

Homepage

Issues

pkg:composer/simsoft/validator

Statistics

Installs: 427

Dependents: 2

Suggesters: 1

Stars: 0

3.0.1 2026-05-28 00:40 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:

Available Constraints

All Symfony validation constraints are supported. See Symfony Validation Constraints.

License

MIT License. See LICENSE for details.