Valitron
last modified January 10, 2023
PHP Valitron tutorial shows how to validate PHP values with Valitron validation package.
$ php -v php -v PHP 8.1.2 (cli) (built: Aug 8 2022 07:28:23) (NTS) ...
We use PHP version 8.1.2.
Valitron
Valitron is a simple, minimal and elegant stand-alone validation library with no dependencies.
Installation
$ composer require vlucas/valitron $ composer require tightenco/collect
We install the Valitron package and the Laravel's collection package.
Simple example
In the first example, we show how to do a very simple validation.
<?php require('vendor/autoload.php'); use Valitron\Validator; $validator = new Validator(['name' => 'John Doe']); $validator->rule('required', 'name'); if($validator->validate()) { echo "Validation passed"; } else { $coll = collect($validator->errors()); $messages = $coll->flatten(); foreach ($messages as $message) { echo $message . "\n"; } }
The example validates one required value.
use Valitron\Validator;
We include the validator.
$validator = new Validator(['name' => 'John Doe']);
We create the instance of the Validator
and pass it a
value to be validated.
$validator->rule('required', 'name');
We specify a required
rule with the rule
method.
if($validator->validate()) {
The validation is performed with validate
.
$coll = collect($validator->errors()); $messages = $coll->flatten(); foreach ($messages as $message) { echo $message . "\n"; }
If the validation fails, we get the errors and display them.
$ php simple.php Validation passed
This is the output.
Validation rules
Valitron contains a set of predefined rules, such as required
,
email
, min
, max
, or url
.
The rules can be combined with the |
character.
<?php require('vendor/autoload.php'); use Valitron\Validator; $rules = [ 'required' => ['name', 'email'], 'alphaNum' => 'name', 'integer' => 'age', 'min' => [['age', 1]], 'email' => 'email' ]; $validator = new Validator(['name' => 'John Doe', 'age' => 34]); $validator->rules($rules); if ($validator->validate()) { echo "Validation passed"; } else { $errors = $validator->errors(); foreach ($errors as $arr) { foreach ($arr as $error) { echo $error . "\n"; } }; }
The example uses several validation rules.
$rules = [ 'required' => ['name', 'email'], 'alphaNum' => 'name', 'integer' => 'age', 'min' => [['age', 1]], 'email' => 'email' ];
We have four validation rules. The name
and email
are required. The name
must be alphanumeric value, age
must be integer and its minimal value is 1. Finally, the email
must be a valid email address.
$ php multiple_rules.php Email is required Email is not a valid email address Name must contain only letters a-z and/or numbers 0-9
The example finished with three validation failures.
Valitron chaining rules
It is possible to add rules by chaining rule
methods.
<?php require('vendor/autoload.php'); use Valitron\Validator; $validator = new Validator(['name' => 'John Doe', 'email' => 'johndoe#gmail.com']); $validator->rule('required', 'name')->rule('email', 'email'); if($validator->validate()) { echo "Validation passed"; } else { $coll = collect($validator->errors()); $messages = $coll->flatten(); foreach ($messages as $message) { echo $message . "\n"; } }
The example chaines two rules.
$validator->rule('required', 'name')->rule('email', 'email');
We add two validation rules by chaining rule
methods.
Validating dates
There are four validation rules for dates: date
, dateFormat
,
dateBefore
and dateAfter
.
<?php require('vendor/autoload.php'); use Valitron\Validator; $validator = new Validator(['created_at' => '2019-03-01']); $validator->rule('dateBefore', 'created_at', '2018-10-13'); if ($validator->validate()) { echo "Validation passed"; } else { $coll = collect($validator->errors()); $messages = $coll->flatten(); foreach ($messages as $message) { echo $message . "\n"; } }
The example validates two dates using dateBefore
rule.
$validator = new Validator(['created_at' => '2019-03-01']); $validator->rule('dateBefore', 'created_at', '2018-10-13');
With the dateBefore
rule, we validate that the given date is before some
other date.
$ php date_before.php Created At must be date before '2018-10-13'
This is the output.
Validating IP addresses
IP addresses are validated with the ip
rule.
<?php require 'vendor/autoload.php'; use Valitron\Validator; $vals = ['ip1' => '127.0.0.1', 'ip2' => 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 'ip3' => 'FE80::0202:B3FF:FE1E:8329', 'ip4' => '0.0.1']; $coll = collect($vals); $coll->each(function ($value, $key) { $validator = new Validator([$key => $value]); $validator->rule('ip', $key); if ($validator->validate()) { echo "Validation passed for $key with $value" . "\n"; } else { $errs = collect($validator->errors()); $messages = $errs->flatten(); foreach ($messages as $message) { echo $message . "\n"; } } });
The example validates IP v4 IP v6 addresses.
$ php ipaddress.php Validation passed for ip1 with 127.0.0.1 Validation passed for ip2 with FE80:0000:0000:0000:0202:B3FF:FE1E:8329 Validation passed for ip3 with FE80::0202:B3FF:FE1E:8329 Ip4 is not a valid IP address
This is the output.
Custom messages
We can provide custom validation messages. The messages are passed with
message
.
<?php require('vendor/autoload.php'); use Valitron\Validator; $validator = new Validator(['name' => '']); $validator->rule('required', 'name')->message('{field} is compulsory')->label("name"); $validator->rule('lengthMin', 'name', 2)->message('{field} must have at least 2 characters') ->label("name"); if($validator->validate()) { echo "Validation passed"; } else { $coll = collect($validator->errors()); $messages = $coll->flatten(); foreach ($messages as $message) { echo $message . "\n"; } }
The example adds custom messages.
$validator->rule('required', 'name')->message('{field} is compulsory')->label("name");
Using chained method calls, we add our custom validation message.
$ php custom_message.php name is compulsory name must have at least 2 characters
This is the output.
Validation subsets of values
Subsets of values are validated with the subset
rule.
<?php require('vendor/autoload.php'); use Valitron\Validator; $vals = ['colors' => ['green', 'blue', 'black']]; $validator = new Validator($vals); $validator->rule('subset', 'colors', ['red', 'green', 'blue', 'orange', 'yellow']); if ($validator->validate()) { echo "Validation passed"; } else { $coll = collect($validator->errors()); $messages = $coll->flatten(); foreach ($messages as $message) { echo $message . "\n"; } }
The example checks if the $vals
variable contains colours from
the defined subset of colour values.
Validating GET data
In the following example, we validate GET data.
<?php require('vendor/autoload.php'); use Valitron\Validator; $validator = new Validator($_GET); $validator->rule('required', ['name', 'email']); $validator->rule('email', 'email'); if ($validator->validate()) { echo "Validation passed"; } else { $coll = collect($validator->errors()); $messages = $coll->flatten(); foreach ($messages as $message) { echo $message . "\n"; } }
The example validates name and email parameters from a GET request.
$validator = new Validator($_GET);
The global $_GET
variable is passed to the Validator
.
$ php -S localhost:8000 PHP 7.2.11 Development Server started at Sat Feb 23 17:24:05 2019 Listening on http://localhost:8000 Document root is C:\Users\Jano\Documents\php-progs\valitron Press Ctrl-C to quit.
We start the built-in web server.
$ curl "localhost:8000/get_data.php?name=John%20Doe&email=john.doe#gmail.com" Email is not a valid email address
We create a GET request with two parameters with the curl
tool.
In this article we have used Valitron to validate PHP values.
Author
List all PHP tutorials.