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:
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
| Rule | Description | Example | ||
|---|---|---|---|---|
required | Field must be present and not empty | 'name' => 'required' | ||
nullable | Field may be null or empty | `'phone' => 'nullable\ | numeric'` | |
email | Must be a valid email address format | `'email' => 'required\ | email'` | |
min:value | Minimum string length or numeric value | 'password' => 'min:8' | ||
max:value | Maximum string length or numeric value | 'title' => 'max:255' | ||
numeric | Must be a numeric value | `'price' => 'required\ | numeric'` | |
integer | Must be an integer | `'age' => 'required\ | integer\ | min:1'` |
in:foo,bar | Must match one of the allowed values | 'role' => 'in:admin,editor,user' | ||
confirmed | Field must match {field}_confirmation | 'password' => 'confirmed' | ||
unique:table,col | Must be unique in the specified database table | 'email' => 'unique:users,email' | ||
url | Must be a valid URL | `'website' => 'nullable\ | url'` |
Displaying Validation Errors in Views
In your .veldora.php templates, display validation feedback easily:
<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:
php veldora make:request StoreUserRequestnamespace 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:
php veldora make:rule UppercaseThis creates app/Rules/Uppercase.php implementing Veldora\Framework\Validation\Rule:
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():
use App\Rules\Uppercase;
$validated = $request->validate([
'code' => ['required', 'string', new Uppercase()],
]);