Server-Side Form Validation Library for PHP
Install Verum PHP with Composer
composer require sandromiguel/verum-php
Validate a simple registration form
use Verum\Validator;
$rules = [
'name' => [
'rules' => [
'required',
],
],
'email' => [
'rules' => [
'required',
'email',
],
],
'age' => [
'rules' => [
'numeric',
],
],
];
$validator = new Validator($_POST, $rules);
echo json_encode(
[
'valid' => $validator->validate(),
'errors' => $validator->getErrors(),
]
);
Input:
[
'name' => 'John Doe',
'email' => '[email protected]',
'age' => '20',
]
Output:
{
"valid": true,
"errors": []
}
Input:
[
'name' => '',
'email' => 'some text',
'age' => 'some text',
]
Output:
{
"valid": false,
"errors": {
"name": {
"label": null,
"rules": {
"required": "This field is required."
}
},
"email": {
"label": null,
"rules": {
"email": "This field must be a valid email address."
}
},
"age": {
"label": null,
"rules": {
"numeric": "This field must be numeric."
}
}
}
}
You can use the RuleEnum
class to access all rule names.
use Verum\Validator;
use Verum\Enum\RuleEnum;
$rules = [
'name' => [
'rules' => [
RuleEnum::REQUIRED,
],
],
...
];
$rules = [
'name' => [
'label' => 'Name',
'rules' => [
RuleEnum::REQUIRED,
],
],
...
];
Output:
{
...
"errors": {
"name": {
"label": "Name",
"rules": {
"required": 'The "Name" field is required.'
}
},
...
}
}
$rules = [
'name' => [
'label' => [
'en' => 'Name',
'pt-pt' => 'Nome',
],
'rules' => [
RuleEnum::REQUIRED,
],
],
...
];
Output (pt-pt):
{
...
"errors": {
"name": {
"label": "Nome",
"rules": {
"required": 'O campo "Nome" Ă© obrigatĂłrio.'
}
},
...
}
}
$validator = new Validator($_POST, $rules, 'pt-pt');
use Verum\Validator;
use Verum\Enum\LangEnum;
...
$validator = new Validator($_POST, $rules, LangEnum::PT_PT);
- Useful to override the default error message.
- Useful for localization.
...
$validator = new Validator($_POST, $rules);
$validator->addSimpleCustomMessage('min_length', 'Min Length rule custom error message');
...
Output example:
{
...
"errors": {
"name": {
"label": "Name",
"rules": {
"min_length": "Min Length rule custom error message"
}
},
...
}
}
...
$validator = new Validator($_POST, $rules);
$validator->addSimpleCustomMessage('min_length', 'Number of characters detected: {param:1}. Field name: "{param:2}".');
...
Output example:
{
...
"errors": {
"name": {
"label": "Name",
"rules": {
"min_length": 'Number of characters detected: 5. Field name: "Name".'
}
},
...
}
}
...
$validator = new Validator($_POST, $rules);
$validator->addCustomMessage(
'required',
'Custom error message with label for required rule. Label: {param:1}.',
'Custom error message without label for required rule.'
);
...
Output - Field with label:
{
...
"errors": {
"name": {
"label": "Name",
"rules": {
"required": 'Custom error message with label for required rule. Label: Name.'
}
},
...
}
}
Output - Field without label:
{
...
"errors": {
"name": {
"label": null,
"rules": {
"required": "Custom error message without label for required rule."
}
},
...
}
}
...
$validator = new Validator($_POST, $rules);
$validator->addCustomMessages(
[
'min_length' => 'Custom message for the "min_length" rule.',
'required' => 'Custom message for the "required" rule.',
// other messages ...
]
);
...
...
$validator = new Validator($_POST, $rules);
$validator->addCustomMessages(
[
'numeric' => [
'withLabel' => 'Custom message with label for "numeric" rule. Label: {param:1}.',
'withoutLabel' => 'Custom message without label for "numeric" rule.',
],
'min_length' => [
'withLabel' => 'Custom message with label for "min_length" rule. Label: {param:2}, value: {param:1}.',
'withoutLabel' => 'Custom message without label for "min_length" rule. Value: {param:1}.',
],
// other messages ...
]
);
...
Checks whether the value contains only alphabetic characters.
$rules = [
'nickname' => [
'label' => 'Nickname',
'rules' => [
RuleEnum::ALPHA,
],
],
];
Checks whether the value contains only alphanumeric characters.
$rules = [
'nickname' => [
'label' => 'Nickname',
'rules' => [
RuleEnum::ALPHA_NUMERIC,
],
],
];
Checks whether the value is between two values.
$rules = [
'age' => [
'label' => 'Age',
'rules' => [
RuleEnum::BETWEEN => [12, 29],
],
],
];
Checks whether the number of characters of the value is between min and max values.
$rules = [
'nickname' => [
'label' => 'Nickname',
'rules' => [
RuleEnum::BETWEEN_LENGTH => [3, 15],
],
],
];
Checks whether the value is a boolean value. Returns true for 1/0, '1'/'0', 'on'/'off', 'yes'/'no', true/false.
$rules = [
'light' => [
'label' => 'Light',
'rules' => [
RuleEnum::BOOLEAN_VALUE,
],
],
];
Checks whether the value is in an array.
$rules = [
'priority' => [
'label' => 'Priority',
'rules' => [
RuleEnum::CONTAINS => ['low', 'high'],
],
],
];
Checks whether the value is a valid date (Y-m-d) or a custom format.
$rules = [
'dob' => [
'label' => 'Date of birth',
'rules' => [
RuleEnum::DATE,
],
],
];
Checks whether the value has a valid email format.
$rules = [
'email' => [
'label' => 'Email',
'rules' => [
RuleEnum::EMAIL,
],
],
];
Checks whether the value is equal to another.
$rules = [
'repeat_password' => [
'label' => 'Repeat Password',
'rules' => [
RuleEnum::EQUALS => ['password'],
],
],
];
Checks whether the file size does not exceed a given value.
Enter a value in bytes.
$rules = [
'profile_photo' => [
'label' => 'Profile Photo',
'rules' => [
RuleEnum::FILE_MAX_SIZE => [102400],
],
],
];
Checks whether the file type is allowed.
$rules = [
'profile_photo' => [
'label' => 'Profile Photo',
'rules' => [
RuleEnum::FILE_MIME_TYPE => ['image/png', 'image/jpeg'],
],
],
];
Checks whether the value is a floating point number.
$rules = [
'price' => [
'label' => 'Price',
'rules' => [
RuleEnum::FLOAT_NUMBER,
],
],
];
Checks whether the image height does not exceed a given value.
$rules = [
'profile_photo' => [
'label' => 'Profile Photo',
'rules' => [
RuleEnum::IMAGE_MAX_HEIGHT => [600],
],
],
];
Checks whether the image width does not exceed a given value.
$rules = [
'profile_photo' => [
'label' => 'Profile Photo',
'rules' => [
RuleEnum::IMAGE_MAX_WIDTH => [1000],
],
],
];
Checks whether the image height is not less than a given value.
$rules = [
'profile_photo' => [
'label' => 'Profile Photo',
'rules' => [
RuleEnum::IMAGE_MIN_HEIGHT => [300],
],
],
];
Checks whether the image width is not less than a given value.
$rules = [
'profile_photo' => [
'label' => 'Profile Photo',
'rules' => [
RuleEnum::IMAGE_MIN_WIDTH => [500],
],
],
];
Checks whether the value is a valid IP address.
$rules = [
'ip' => [
'label' => 'IP',
'rules' => [
RuleEnum::IP,
],
],
];
Checks whether the value is a valid IPv4 address.
$rules = [
'ipv4' => [
'label' => 'IPv4',
'rules' => [
RuleEnum::IPV4,
],
],
];
Checks whether the value is a valid IPv6 address.
$rules = [
'ipv6' => [
'label' => 'IPv6',
'rules' => [
RuleEnum::IPV6,
],
],
];
Checks whether the value does not exceed a given value.
$rules = [
'people' => [
'label' => 'People',
'rules' => [
RuleEnum::MAX => [5],
],
],
];
Checks whether the number of characters of the value does not exceed a given value.
$rules = [
'nickname' => [
'label' => 'Nickname',
'rules' => [
RuleEnum::MAX_LENGTH => [15],
],
],
];
Checks whether the value is not less than a given value.
$rules = [
'people' => [
'label' => 'People',
'rules' => [
RuleEnum::MIN => [2],
],
],
];
Checks whether the number of characters of the value is not less than a given value.
$rules = [
'nickname' => [
'label' => 'Nickname',
'rules' => [
RuleEnum::MIN_LENGTH => [2],
],
],
];
Checks whether the value is numeric.
$rules = [
'age' => [
'label' => 'Age',
'rules' => [
RuleEnum::NUMERIC,
],
],
];
Checks whether the value matches a given regular expression.
$rules = [
'path' => [
'label' => 'Path',
'rules' => [
RuleEnum::REGEX => ['/client/[0-9a-f]+$'],
],
],
];
Checks whether the value is not empty.
$rules = [
'name' => [
'label' => 'Name',
'rules' => [
RuleEnum::REQUIRED,
],
],
];
Checks whether the value is a valid Slug (e.g. hello-world_123).
$rules = [
'slug' => [
'label' => 'Slug',
'rules' => [
RuleEnum::SLUG,
],
],
];
Checks whether the value is a valid URL.
$rules = [
'url' => [
'label' => 'URL',
'rules' => [
RuleEnum::URL,
],
],
];
Want to contribute? All contributions are welcome. Read the contributing guide.
If you have questions tweet me at @sandro_m_m or open an issue.
This project is licensed under the MIT License - see the LICENSE file for details
**~ sharing is caring ~**