Yet another validation class for PHP
Validation is the process that checks for correctness, meaningfulness and security of the input data. SimpleValidator is a library that handles validation process easily., (*2)
Add this line into require
in your composer.json:, (*3)
"simple-validator/simple-validator": "1.0.*"
and call, (*4)
php composer.phar update
Download composer.phar
and call, (*5)
php composer.phar install
and use autoload.php to include the classes, (*6)
require 'vendor/autoload.php'
<?php $rules = [ 'name' => [ 'required', 'alpha', 'max_length(50)' ], 'age' => [ 'required', 'integer', ], 'email' => [ 'required', 'email' ], 'password' => [ 'required', 'equals(:password_verify)' ], 'password_verify' => [ 'required' ] ]; $validation_result = SimpleValidator\Validator::validate($_POST, $rules); if ($validation_result->isSuccess() == true) { echo "validation ok"; } else { echo "validation not ok"; var_dump($validation_result->getErrors()); }
Anonymous functions make the custom validations easier to be implemented., (*7)
$rules = [ 'id' => [ 'required', 'integer', 'post_exists' => function($input) { $query = mysqli_query("SELECT * FROM post WHERE id = " . $input); if (mysqli_num_rows($query) == 0) return false; return true; }, 'between(5,15)' => function($input, $param1, $param2) { if (($input > $param1) && ($input < $param2)) return true; return false; } ] ];
and you need to add an error text for your rule to the error file (default: errors/en.php)., (*8)
'post_exists' => "Post does not exist"
or add a custom error text for that rule, (*9)
$validation_result->customErrors([ 'post_exists' => 'Post does not exist' ]);
// my local variable $var_to_compare = "1234"; $rules = [ 'password' => [ 'required', 'integer', // pass my local variable to anonymous function 'is_match' => function($input) use (&$var_to_compare) { if ($var_to_compare == $input) return true; return false; } ] ];
You can assume SimpleValidator as a tool or an interface to create a validator for yourself., (*10)
Custom validators can have their own rules, own error files or default language definitions. In addition, you can override default rules in your custom validator., (*11)
class MyValidator extends \SimpleValidator\Validator { // methods have to be static !!! protected static function is_awesome($input) { if ($input == "awesome") return true; return false; } // overriding a default rule (url) protected static function url($input) { return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $input); } // set default language for your validator // if you don't override this method, the default language is "en" protected function getDefaultLang() { return getMyApplicationsDefaultLanguage(); } // defining error files for your validator // in this example your files should live in "{class_path}/errors/{language}/validator.php protected function getErrorFilePath($lang) { return __DIR__ . "/errors/" . $lang . "/validator.php"; } }
Create an error file:, (*12)
return [ 'is_awesome' => 'the :attribute is not awesome' // error text for url is already defined in default error text file you don't have to define it here, but optionally you can ];
And then, call the validate
method., (*13)
$rules = [ 'website' => [ 'is_awesome', 'url' ] ]; $validation_result = MyValidator::validate($_POST, $rules);
A rule can have multiple parameters. An example:, (*14)
$rule = [ 'id' => [ 'rule1(:input1,:input2,2,5,:input3)' => function($input, $input1, $input2, $value1, $value2, $input3) { // validation here } ], // and so on.. ];
Custom rules provides localization for the error messages.
Create a new file under errors folder, example: errors/es.php
and call getErrors()
method using:, (*15)
$validation_result->getErrors('es');
You can add custom errors using customErrors method., (*16)
$validation_result->customErrors([ // input_name.rule => error text 'website.required' => 'We need to know your web site', // rule => error text 'required' => ':attribute field is required', 'name.alpha' => 'Name field must contain alphabetical characters', 'email_addr.email' => 'Email should be valid', 'email_addr.min_length' => 'Hey! Email is shorter than :params(0)', 'min_length' => ':attribute must be longer than :params(0)' ]);
$naming => [ 'name' => 'Name', 'url' => 'Web Site', 'password' => 'Password', 'password_verify' => 'Password Verification' ]; $validation_result = SimpleValidator\Validator::validate($_POST, $rules, $naming);
You can explicitly check out the validations using has
method that might be useful for Unit Testing purposes., (*17)
// All return boolean $validation_result->has('email'); $validation_result->has('email','required'); $validation_result->has('password','equals');
Rule | Parameter | Description | Example |
---|---|---|---|
required | No | Returns FALSE if the input is empty | |
numeric | No | Returns FALSE if the input is not numeric | |
No | Returns FALSE if the input is not a valid email address | ||
integer | No | Returns FALSE if the input is not an integer value | |
float | No | Returns FALSE if the input is not a float value | |
alpha | No | Returns FALSE if the input contains non-alphabetical characters | |
alpha_numeric | No | Returns FALSE if the input contains non-alphabetical and numeric characters | |
ip | No | Returns FALSE if the input is not a valid IP (IPv6 supported) | |
url | No | Returns FALSE if the input is not a valid URL | |
max_length | Yes | Returns FALSE if the input is longer than the parameter | max_length(10) |
min_length | Yes | Returns FALSE if the input is shorter than the parameter | min_length(10) |
exact_length | Yes | Returns FALSE if the input is not exactly parameter value long | exact_length(10) |
equals | Yes | Returns FALSE if the input is not same as the parameter | equals(:password_verify) or equals(foo) |