A simple php validator inspired by laravel form request validation and Respect/Validation.
Via composer
composer require jetfirephp/validator
Simple usage of \JetFire\Validator\Validator
:
require_once __DIR__ . '/vendor/autoload.php';
$response = \JetFire\Validator\Validator::isAlpha('Peter Parker');
// if not valid
if(!$response){
// your code
// ...
}
If you want to validate multiple values you can do it like this :
require_once __DIR__ . '/vendor/autoload.php';
$response = \JetFire\Validator\Validator::validate([
'Peter Parker 1' => 'alpha|length:<60',
'20' => 'int|max:40|min:10',
'peter.parker@spiderman.com' => 'email|noWhitespace',
'+347123456789' => 'phone',
'11375' => 'postalCode:US'
]);
if($response['valid']){
// Continue your code
// ...
}else{
// $response['message'] return an array of messages for each value and rule
// $response['message']['_field_']['_rule_']
// for example the first validation will return an error because 'Petet Parker 1' doesn't contains only letters
// to get the return message : $response['message']['Peter Parker 1']['alpha']
}
As you can see it's not very convenient to have value as a key to error messages. If you want to add a key for your values you have to add your key before the value, like this :
$response = \JetFire\Validator\Validator::validate([
'name::Peter Parker 1' => 'alpha|length:<60',
'age::20' => 'int|max:40|min:10',
'email::peter.parker@spiderman.com' => 'email|noWhitespace',
'phone::+347123456789' => 'phone',
'code::11375' => 'postalCode:US'
]);
// You can get now the error message for 'Peter Parker 1' like this $response['message']['name']['alpha']
For $_POST
validation you have to specify the input name like this :
$response = \JetFire\Validator\Validator::validatePost([
'firstName|lastName' => 'alpha|length:<60',
'age' => 'int|max:40|min:10',
'email' => 'email|noWhitespace',
'phone' => 'phone',
'postal_code' => 'postalCode:US'
]);
For $_GET
validation you have to use \JetFire\Validator\Validator::validateGet
.
You can set your custom messages for validation. You have to pass an array in second argument of \JetFire\Validator\Validator::validate
:
$response = \JetFire\Validator\Validator::validatePost([
'firstName|lastName' => 'alpha|length:<60',
],[
'alpha:firstName' => 'FirstName must contains only letters', // only applied for firstName not for lastName
'length' => ':field must not exceed 60 characters', // :field is replaced by field name (firstName or lastName)
]);
You can create your own rules for validation like this :
\JetFire\Validator\Validator::addRule('maximum', function($request,$param,$parameters = null){
return (!empty($parameters['maximum']) && (int)$request[$param] <= (int)$parameters['maximum'])
? true
: '"' . $param . '" must be lower than "'.$parameters['maximum'].'"';
});
$response = JetFire\Validator\Validator::validate([
'number::20' => 'maximum:30'
]);
$request
contains all input values (You can get the current input value over $request[$param])
$param
is the input name
$parameters
contains the string after ':'
Or you can define your rules in an array and pass it to \JetFire\Validator\Validator::addRules()
:
$rules = [
'maximum' => function($request,$param,$parameters = null){
return (!empty($parameters['maximum']) && (int)$request[$param] <= (int)$parameters['maximum'])
? true
: '"' . $param . '" must be lower than "'.$parameters['maximum'].'"';
},
'minimum' => function($request,$param,$parameters = null){
return (!empty($parameters['min']) && (int)self::$request[$param] <= (int)$parameters['min'])
? true
: '"' . $param . '" must be higher than "'.$parameters['min'].'"';
},
];
\JetFire\Validator\Validator::addRules($rules);
Here are the list of available rules :
Evaluates a regex on the input and validates if matches
'Peter Parker' => 'regex:/[a-zA-Z]/', // true
Validates characters from a-Z
'Peter Parker' => 'alpha', // true
'Peter - Parker' => 'alpha', // false
Validates alphanumeric characters from a-Z and 0-9.
'Peter Parker 20' => 'alnum', // true
'Peter Parker - 20' => 'alnum', // false
Validates if the input is an string.
// for $_POST and $_GET validation
// type string
'firstName' => 'string', // true
Validates if the input is an integer.
// for $_POST and $_GET validation
// type int
'age' => 'int', // true
Validates on any numeric value.
'20' => 'numeric', // true
'-20' => 'numeric', // true
'2.0' => 'numeric', // true
Validates if the input doesn't exceed the maximum value or if is greater than the minimum value.
'20' => 'max:30|min:10', // true
'-20' => 'max:1|min:-30', // true
Validates if input is an URL:
'http://example.com' => 'url', // true
'https://www.youtube.com/watch?v=6FOUqQt3Kg0' => 'url', // true
Validates if the input is a boolean value:
'1' => 'boolean', // true
'true' => 'boolean', // true
Validates if input is a date:
'20-01-2016' => 'date:d-m-y', // true
'2016-01-20' => 'date:y-m-d', // true
Validates if string characters are lowercase in the input:
'peter parker 20' => 'lowercase', // true
Validates if string characters are uppercase in the input:
'PETER PARKER' => 'uppercase', // true
Validates if a string contains no whitespace (spaces, tabs and line breaks);
'Peter Parker' => 'noWhitespace', // false
'Peter-Parker' => 'noWhitespace', // true
Validates an email address.
'peter.parker@spiderman.com' => 'email', // true
Validates a valid 7, 10, 11 digit phone number (North America, Europe and most Asian and Middle East countries), supporting country and area codes (in dot, space or dashed notations) such as:
'(555)555-5555' => 'phone', // true
// other phone numbers accepted
(555)555-5555
555 555 5555
+5(555)555.5555
33(1)22 22 22 22
+33(1)22 22 22 22
+33(020)7777 7777
03-6106666
Validates a postal code according to the given country code.
'75000' => 'postalCode:FR', // true
'02179000' => 'postalCode:BR', // true
'02179-000' => 'postalCode:BR', // true
'02179-000' => 'postalCode:US', // false
'55372' => 'postalCode:US', // true
Validates if the input is equal to some value.
'Peter Parker' => 'equal:Peter Parker', // true
// you can pass php function to check a value like this :
'password' => 'equal:password_verify,your_password',
'password' => 'equal:md5,your_password',
Validates if the input contains one of the following values.
'Peter' => 'values:Peter,Parker,Spiderman', // true
'Peter' => 'values:Parker,Spiderman', // false
Validates if the input is equal to another input.
// for $_POST and $_GET validation
// firstName = Peter
'firstName' => 'alpha', // true
// lastName = Peter
'lastName' => 'same:firstName', // true
Validates lengths.
'Peter' => 'length:5', // true
'Peter' => 'length:>4', // true
'Peter' => 'length:<6', // true
'Peter' => 'length:4,5', // true
Validates if the file is a valid image by checking its MIME type.
'image.jpg' => 'image', // true
// other supported MIME ['png', 'jpeg', 'gif', 'svg', 'bmp']
All the validations above must return false if the input is not a valid file or of the MIME doesn't match with the file extension.
Validates if the file extension matches the expected one:
'image.jpg' => 'mimes:jpg', // true
Validates file sizes:
// size in octet
'image.jpg' => 'size:10000', // true
'image.jpg' => 'size:<10000', // true
'image.jpg' => 'size:>10000', // true
'image.jpg' => 'size:10000,20000', // true
Validates image height or width:
// height and width in px
'image.jpg' => 'height:200|width:200', // true
'image.jpg' => 'height:<200|width:<200', // true
'image.jpg' => 'height:>200|width:>200', // true
'image.jpg' => 'height:200,300|width:200,300', // true
Validates if the input is set.
// for $_POST & $_GET
'firstName' => 'set', // true
// php : if(isset($_POST['firstName'])) or if(isset($_GET['firstName']))
Check if the input is set and not empty
// for $_POST & $_GET
'firstName' => 'required', // true
The field is required if it validates some condition
// for $_POST & $_GET
'firstName' => 'required', // true
// lastName is required if value1 is equal to value2
'lastName' => 'requiredIf:value1,value2',
// lastName is required if firstName is set and not empty
'lastName => 'requiredIf:field,firstName',
// lastName is required if firstName is set and empty
'lastName' => 'requiredIf:empty_field,firstName',
// lastName is required if firstName is set
'lastName' => 'requiredIf:field_set,firstName',
// lastName is required if firstName is not set
'lastName' => 'requiredIf:field_not_set,firstName',
// lastName is required if firstName value is equal to Peter
'lastName' => 'requiredIf:field_value,firstName,Peter',
// lastName is required if firstName value is not equal to Peter
'lastName' => 'requiredIf:field_value_not,firstName,Peter',
The input is required with other inputs
'firstName1::Peter|lastName1::Parker' => '',
'firstName2::|lastName2::Parker' => '',
// age is required with firstName and lastName
'age1::20' => 'requiredWith:firstName1,lastName1', // true
'age2::20' => 'requiredWith:firstName2,lastName2', // false firstName1 is empty
'age3::' => 'requiredWith:firstName1,lastName1', // false age is empty
The input is required with one of the following inputs
'firstName1::Peter|lastName1::Parker' => '',
'firstName2::Peter|lastName2::' => '',
'firstName3::|lastName3::' => '',
// age is required with one of the following inputs
'age1::20' => 'requiredOneOf:firstName1,lastName1', // true
'age2::20' => 'requiredOneOf:firstName2,lastName2', // true
'age3::20' => 'requiredOneOf:firstName3,lastName3', // false firstName3 or lastName3 must not be empty
'age4::' => 'requiredOneOf:firstName1,lastName1', // false age is required
The input is optional but the followings inputs must not be empty
'firstName1::Peter|lastName1::Parker' => '',
'firstName2::Peter|lastName2::' => '',
// age is optional but the followings input must not be empty
'age1::20' => 'with:firstName1,lastName1', // true
'age1::' => 'with:firstName1,lastName1', // true
'age2::20' => 'with:firstName2,lastName2', // false
The input is optional but one of the following input must not be empty
'firstName1::Peter|lastName1::Parker' => '',
'firstName2::|lastName2::' => '',
// age is optional but one of the following input must not be empty
'age1::20' => 'with:firstName1,lastName1', // true
'age1::' => 'with:firstName1,lastName1', // true
'age2::20' => 'with:firstName2,lastName2', // false
The input is optional and the following rules are not executed if the input is empty
'firstName::' => 'optional|alpha|length:<20', // true
'firstName::Peter' => 'optional|alpha|length:<20', // true
'firstName::Peter 2' => 'optional|alpha|length:<20', // false
The input is optional if it validates some condition
'firstName::Peter' => '',
// lastName is optional if value1 is equal to value2
'lastName' => 'optionalIf:value1,value2',
// lastName is optional if firstName is set and not empty
'lastName => 'optionalIf:field,firstName',
// lastName is optional if firstName is set and empty
'lastName' => 'optionalIf:empty_field,firstName',
// lastName is optional if firstName is set
'lastName' => 'optionalIf:field_set,firstName',
// lastName is optional if firstName is not set
'lastName' => 'optionalIf:field_not_set,firstName',
// lastName is optional if firstName value is equal to Peter
'lastName' => 'optionalIf:field_value,firstName,Peter',
// lastName is optional if firstName value is not equal to Peter
'lastName' => 'optionalIf:field_value_not,firstName,Peter',
Skip the input rules if it valid some condition
'firstName::Peter' => '',
// skip lastName if value1 is equal to value2
'lastName' => 'skipIf:value1,value2',
// skip lastName if firstName is set and not empty
'lastName => 'skipIf:field,firstName',
// skip lastName if firstName is set and empty
'lastName' => 'skipIf:empty_field,firstName',
// skip lastName if firstName is set
'lastName' => 'skipIf:field_set,firstName',
// skip lastName if firstName is not set
'lastName' => 'skipIf:field_not_set,firstName',
// skip lastName if firstName value is equal to Peter
'lastName' => 'skipIf:field_value,firstName,Peter',
// skip lastName if firstName value is not equal to Peter
'lastName' => 'skipIf:field_value_not,firstName,Peter',
'name1::Peter' => 'add:end,Parker', // name1 = Peter Parker
'name2::Parker' => 'add:begin,Peter', // name2 = Peter Parker
// you can modify your input value with a crypt function
'password::Peter' => 'assign:crypt,password_hash', // password = password_hash('Peter', PASSWORD_BCRYPT);
// you can use other crypt function like md5, sha5 ..
// change your input value
'name::Parker' => 'assign:Peter', // name = Peter
// or
'name::Parker' => 'assign:value,Peter', // name = Peter
// change your input value with another input value
'firstName::Peter' => '',
'lastName::Parker' => 'assign:field,firstName', // lastName = Peter
// assign the file name to file input
'file' => 'assign:file'
// assign this input value to another input
'firstName::Peter' => '',
'lastName::Parker' => 'assign:this,firstName', // firstName = Parker
The JetFire Validator is released under the MIT public license : http://www.opensource.org/licenses/MIT.