Validation
Miko Framework provides comprehensive input validation for forms, API requests, and user inputs.
Validation Methods
| Method | Description |
|---|---|
validate($rules) | Apply rules and validate |
errors() | Get all errors |
firstError($field) | Get first error for field |
fails() | Check if validation failed |
passes() | Check if validation passed |
Basic Usage
use Miko\Core\Validation\Validator;
$data = [
'name' => 'John Doe',
'email' => 'john@example.com',
'age' => 25
];
$validator = new Validator($data);
$validator->validate([
'name' => 'required|min:2|max:100',
'email' => 'required|email',
'age' => 'required|integer'
]);
if ($validator->fails()) {
$errors = $validator->errors();
// Handle errors
} else {
// Validation passed
}
Validation Rules
Implemented rules (unknown rule names are ignored):
'name' => 'required',
'email' => 'email',
'name' => 'min:2|max:100', // character length, not numeric min/max
'age' => 'integer',
'price' => 'numeric',
'phone' => 'phone',
'birth_date' => 'date',
'website' => 'url',
'role' => 'in:user,admin,moderator',
'password' => 'required|min:8|confirmed', // looks for password_confirmation
'code' => 'regex:/^[A-Z]{3}-[0-9]{4}$/',
'iban' => 'iban',
'id' => 'uuid',
'card' => 'creditCard',
'ip' => 'ip', // also ipv4, ipv6
'mac' => 'mac',
'bic' => 'bic',
These do not exist on Validator: string, nullable, required_if, between, alpha_dash, alpha_num, array, file, mimes, unique, exists, after, before. Use PHP 8 model attributes (#[UniqueValue], #[Exists]) for database checks.
PHP 8 Validation Attributes
Use attributes for model validation:
use Miko\Database\ORM\Model;
use Miko\Database\ORM\{Required, MaxLength, Email, Range};
class User extends Model
{
#[Required]
#[MaxLength(100)]
public string $Name;
#[Required]
#[Email]
#[MaxLength(100)]
public string $Email;
#[Required]
#[MinLength(8)]
public string $Password;
#[Range(18, 120)]
public ?int $Age;
}
Available Attributes
#[Required] // Field is required
#[MaxLength(100)] // Maximum string length
#[MinLength(8)] // Minimum string length
#[Email] // Valid email format
#[Url] // Valid URL format
#[Range(1, 100)] // Numeric range
#[Pattern('/pattern/')] // Custom regex
#[UniqueValue('users', 'Email')] // Unique in database
Validating Model
use Miko\Database\ORM\ModelValidator;
$user = new User();
$user->Name = 'John';
$user->Email = 'invalid-email';
$validator = new ModelValidator();
if (!$validator->validate($user)) {
foreach ($validator->getErrors() as $field => $messages) {
echo "$field: " . implode(', ', $messages);
}
}
Custom Error Messages
$validator = new Validator($data);
$validator->validate([
'email' => 'required|email'
]);
Custom per-rule message maps are not supported. Messages are built inside Validator.
API Validation Example
class UserController
{
public function store(): void
{
$data = json_decode(file_get_contents('php://input'), true);
$validator = new Validator($data);
$validator->validate([
'name' => 'required|min:2|max:100',
'email' => 'required|email',
'password' => 'required|min:8|confirmed'
]);
if ($validator->fails()) {
JsonResponse::validationError($validator->errors());
return;
}
$user = User::create([
'Name' => $data['name'],
'Email' => $data['email'],
'Password' => password_hash($data['password'], PASSWORD_DEFAULT)
]);
JsonResponse::created($user->only('Id', 'Name', 'Email'));
}
}
Form Request Validation
class CreateUserRequest
{
public static function rules(): array
{
return [
'name' => 'required|min:2|max:100',
'email' => 'required|email',
'password' => 'required|min:8|confirmed',
'role' => 'required|in:user,admin,moderator'
];
}
public static function messages(): array
{
return [
'name.required' => 'Name is required',
'email.unique' => 'This email is already registered'
];
}
}
// Usage
$validator = new Validator($data);
$validator->validate(
CreateUserRequest::rules(),
CreateUserRequest::messages()
);