aaronadal/validator
Lightweight PHP/Laravel validation package providing a simple API to validate data against rules, collect errors, and customize messages. Useful for quick input checking in apps, forms, and APIs without heavy setup.
Installation
composer require aaronadal/validator
Publish the config (if needed):
php artisan vendor:publish --provider="Aaronadal\Validator\ValidatorServiceProvider"
Define a Rule Set
Create a validator class (e.g., app/Validators/UserValidator.php):
namespace App\Validators;
use Aaronadal\Validator\Validator;
class UserValidator extends Validator
{
protected $rules = [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|string|min:8',
];
protected $messages = [
'name.required' => 'The name field is required.',
'email.unique' => 'This email is already taken.',
];
}
First Use Case: Validate a Request
use App\Validators\UserValidator;
use Illuminate\Http\Request;
public function store(Request $request)
{
$validator = new UserValidator($request->all());
if ($validator->fails()) {
return response()->json($validator->errors(), 422);
}
// Proceed with logic...
}
Aaronadal\Validator\Validator and define $rules and $messages.fails(), passes(), errors(), and validated() (returns sanitized data).Aaronadal\Validator\Rules\Rule for reusable logic.UserValidator, OrderValidator).// app/Validators/OrderValidator.php
class OrderValidator extends Validator
{
protected $rules = [
'items.*.product_id' => 'required|exists:products,id',
'items.*.quantity' => 'required|integer|min:1',
'shipping_address' => 'required|array',
];
}
Illuminate\Foundation\Http\FormRequest and delegate validation.use App\Validators\UserValidator;
class StoreUserRequest extends FormRequest
{
public function validate()
{
$validator = new UserValidator($this->all());
if ($validator->fails()) {
throw new \Illuminate\Validation\ValidationException($validator->errors());
}
return $validator->validated();
}
}
$validator = new UserValidator($data);
if (auth()->user()->isAdmin()) {
$validator->addRule('email', 'required|unique:users,email,null,id');
}
return response()->json([
'errors' => $validator->errors()->toArray(),
], 422);
session()->flash('errors', $validator->errors()->toArray());
public function test_validator_passes()
{
$validator = new UserValidator(['name' => 'John', 'email' => 'john@example.com']);
$this->assertTrue($validator->passes());
}
Rule Syntax:
required|string|max:255), but ensure compatibility with the package’s parser.items.*.field) or custom rules.Error Message Overrides:
$messages in the validator class take precedence over Laravel’s default messages.php artisan vendor:publish to inspect default messages if needed.Immutable Data:
validated() returns sanitized data, but nested arrays may be flattened.$validator->getData() for raw input or manually reconstruct arrays.Performance:
$validator = app()->make(UserValidator::class); // Singleton-like behavior
Validate Raw Input:
$validator = new UserValidator($request->all());
dd($validator->errors()->toArray()); // Debug errors
Check Rule Parsing:
$rules array syntax matches Laravel’s expectations.Validator::make($data, $rules) directly to isolate issues.Custom Rules:
Aaronadal\Validator\Rules\Rule and implement passes().class CustomRule extends Rule
{
public function passes($attribute, $value)
{
return str_contains($value, 'test');
}
}
$rules:
'field' => 'custom_rule_name',
Custom Error Formatters:
Aaronadal\Validator\ErrorFormatter to modify error output (e.g., for GraphQL).class GraphQLErrorFormatter extends ErrorFormatter
{
public function format()
{
return ['errors' => $this->errors];
}
}
AppServiceProvider:
Validator::extend('formatter', function ($attribute, $value, $parameters) {
return new GraphQLErrorFormatter($this->errors);
});
Rule Macros:
Validator::extend('strong_password', function ($attribute, $value) {
return strlen($value) >= 12 && preg_match('/[A-Z]/', $value);
});
'password' => 'required|strong_password',
Event Listeners:
Validator::failing(function ($validator) {
\Log::warning('Validation failed', ['errors' => $validator->errors()]);
});
How can I help you explore Laravel packages today?