VeldoraDocs

9. Validation & Form Requests

Veldora provides an expressive, rule-based validation engine. You can perform inline validation directly inside controller actions or encapsulate validation logic inside reusable Form Request classes.

Inline Validation in Controllers

The $request->validated() method validates incoming request data against a set of rules. If validation fails, it automatically redirects back with input errors and old form values:

example.php
PHP
public function store(Request $request): Response
{
    $data = $request->validated([
        'title'    => 'required|min:3|max:255',
        'email'    => 'required|email|unique:users,email',
        'password' => 'required|min:8|confirmed',
        'age'      => 'nullable|integer|min:18',
        'status'   => 'required|in:draft,published,archived',
    ]);

    // If execution reaches here, data is 100% valid
    $user = User::create($data);

    return Response::redirect('/users')
        ->with('success', 'User created successfully!');
}

Available Validation Rules

RuleDescriptionExample
requiredField must be present and not empty'name' => 'required'
nullableField may be null or empty`'phone' => 'nullable\numeric'`
emailMust be a valid email address format`'email' => 'required\email'`
min:valueMinimum string length or numeric value'password' => 'min:8'
max:valueMaximum string length or numeric value'title' => 'max:255'
numericMust be a numeric value`'price' => 'required\numeric'`
integerMust be an integer`'age' => 'required\integer\min:1'`
in:foo,barMust match one of the allowed values'role' => 'in:admin,editor,user'
confirmedField must match {field}_confirmation'password' => 'confirmed'
unique:table,colMust be unique in the specified database table'email' => 'unique:users,email'
urlMust be a valid URL`'website' => 'nullable\url'`

Displaying Validation Errors in Views

In your .veldora.php templates, display validation feedback easily:

template.veldora.php
HTML
<form method="POST" action="/users">
    @csrf

    <div class="form-group">
        <label for="name">Name</label>
        <input type="text" id="name" name="name" value="{{ old('name') }}" class="input">
        @error('name')
            <span class="text-danger">{{ $message }}</span>
        @enderror
    </div>

    <div class="form-group">
        <label for="email">Email</label>
        <input type="email" id="email" name="email" value="{{ old('email') }}" class="input">
        @error('email')
            <span class="text-danger">{{ $message }}</span>
        @enderror
    </div>

    <button type="submit" class="btn btn-primary">Create User</button>
</form>

Dedicated Form Request Classes

For complex forms, keep controllers clean by creating a dedicated Form Request:

Terminal • bash
php veldora make:request StoreUserRequest

example.php
PHP
namespace App\Http\Requests;

use Veldora\Framework\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    // Authorization logic: return false to abort with 403 Forbidden
    public function authorize(): bool
    {
        return auth()->check() && auth()->user()->is_admin;
    }

    // Validation rules
    public function rules(): array
    {
        return [
            'name'     => 'required|min:2|max:100',
            'email'    => 'required|email|unique:users,email',
            'password' => 'required|min:8|confirmed',
        ];
    }
}

Custom Validation Rules

When built-in rules are not enough, generate a dedicated validation rule class:

Terminal • bash
php veldora make:rule Uppercase

This creates app/Rules/Uppercase.php implementing Veldora\Framework\Validation\Rule:

example.php
PHP
namespace App\Rules;

use Veldora\Framework\Validation\Rule;

class Uppercase implements Rule
{
    /**
     * Determine if the validation rule passes.
     */
    public function passes(string $attribute, mixed $value): bool
    {
        return is_string($value) && strtoupper($value) === $value;
    }

    /**
     * Get the validation error message.
     */
    public function message(): string
    {
        return 'The :attribute must be uppercase.';
    }
}

Use your custom rule by passing an array of rules to $request->validate():

example.php
PHP
use App\Rules\Uppercase;

$validated = $request->validate([
    'code' => ['required', 'string', new Uppercase()],
]);


Building with AI Assistants?
Copy the Veldora AI Developer Prompt to teach ChatGPT, Claude, Cursor, or Gemini all framework APIs for error-free coding.