/ Validation

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()
);