Back to Documentation
API Reference

⚙️Validation API Reference

Siro provides a fluent validation system with 15+ built-in rules, custom rule support, and FormRequest pattern.

Overview#

Siro provides a fluent validation system with 15+ built-in rules, custom rule support, and FormRequest pattern.

php
$validated = $request->validate([
    'email' => 'required|email|max:255|unique:users,email',
    'password' => 'required|min:8|max:255|confirmed',
]);

Available Rules#

String Rules#

RuleDescription
min:NMinimum length
max:NMaximum length
min:NMinimum value/length
max:NMaximum value/length
between:N,MBetween N and M
alphaAlphabetic characters only
alpha_numAlpha-numeric only
alpha_dashAlpha-numeric, dashes, underscores

Type Rules#

RuleDescription
requiredField is required
stringMust be string
numericMust be numeric
integerMust be integer
boolMust be boolean
arrayMust be array
fileMust be uploaded file
imageMust be image (jpeg, png, gif, webp)

Data Rules#

RuleDescription
emailValid email address
urlValid URL
ipValid IP address
dateValid date
datetimeValid datetime
jsonValid JSON string
regex:/pattern/Match regex pattern

Database Rules#

RuleDescription
exists:table,columnValue exists in database
unique:table,columnValue is unique in table

Comparison Rules#

RuleDescription
confirmedField must have _confirmation match
in:a,b,cMust be one of the values
not_in:a,b,cMust not be one of the values
same:fieldMust match another field
different:fieldMust differ from another field

Size Rules#

RuleDescription
size:NExact length/value
min:NMinimum length/value
max:NMaximum length/value

File Rules#

RuleDescription
fileMust be uploaded file
imageMust be image type
mimes:png,jpgAllowed MIME types
min:NMin file size in KB
max:NMax file size in KB

Usage Examples#

Basic Validation#

php
$validated = $request->validate([
    'name' => 'required|string|min:3|max:120',
    'email' => 'required|email|max:255|unique:users,email',
    'password' => 'required|min:8|max:255|confirmed',
]);

Nested Validation#

php
$validated = $request->validate([
    'user.name' => 'required|min:3',
    'user.email' => 'required|email',
    'items.*.product_id' => 'required|exists:products,id',
    'items.*.quantity' => 'required|integer|min:1',
]);

Custom Error Messages#

php
$messages = [
    'email.required' => 'We need your email address',
    'email.email' => 'That does not look like an email',
    'password.min' => 'Password must be at least 8 characters',
];

$validated = $request->validate($rules, $messages);

FormRequest Pattern#

Create FormRequest#

bash
php siro make:request StoreProductRequest

Define Rules#

php
<?php

declare(strict_types=1);

namespace App\Requests;

use Siro\Core\FormRequest;

class StoreProductRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'price' => 'required|numeric|min:0',
            'category_id' => 'required|exists:categories,id',
        ];
    }

    public function messages(): array
    {
        return [
            'name.required' => 'Product name is required',
            'price.min' => 'Price cannot be negative',
        ];
    }
}

Use in Controller#

php
public function store(StoreProductRequest $request): Response
{
    // Already validated
    $data = $request->validated();

    $product = $this->service->create($data);
    return $this->created($data, 'Product created');
}

Custom Rules#

Define Custom Rule#

php
use Siro\Core\Validator;

Validator::extend('phone', function (string $field, mixed $value, array $params): bool {
    return preg_match('/^\+?[\d\s\-\(\)]{7,15}$/', (string) $value) === 1;
}, 'The :field must be a valid phone number.');

// Usage
'phone' => 'required|phone'

Custom Rule with Parameters#

php
Validator::extend('min_age', function (string $field, mixed $value, array $params): bool {
    $minAge = (int) ($params[0] ?? 18);
    $birthDate = new \DateTime((string) $value);
    $age = $birthDate->diff(new \DateTime())->y;
    return $age >= $minAge;
}, 'You must be at least :param0 years old.');

// Usage
'birth_date' => 'required|date|min_age:18'

Error Response#

On validation failure, a 422 response is returned:

json
{
    "success": false,
    "message": "Validation failed",
    "data": null,
    "errors": {
        "email": ["Email has already been taken"],
        "password": ["Password must be at least 8 characters"]
    }
}