jetfirephp/validator

JetFire - Validator

dev-master 2018-07-27 15:38 UTC

This package is not auto-updated.

Last update: 2024-11-09 18:47:23 UTC


README

A simple php validator inspired by laravel form request validation and Respect/Validation.

Installation

Via composer

composer require jetfirephp/validator

Usage

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']

$_POST & $_GET validation

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.

Custom Message

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

Custom Rules

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

Available Rules

Here are the list of available rules :

regex

Evaluates a regex on the input and validates if matches

    'Peter Parker' => 'regex:/[a-zA-Z]/', // true

alpha

Validates characters from a-Z

    'Peter Parker' => 'alpha', // true
    'Peter - Parker' => 'alpha', // false

alnum

Validates alphanumeric characters from a-Z and 0-9.

    'Peter Parker 20' => 'alnum', // true
    'Peter Parker - 20' => 'alnum', // false

string

Validates if the input is an string.

    // for $_POST and $_GET validation
    // type string
    'firstName' => 'string', // true

int

Validates if the input is an integer.

    // for $_POST and $_GET validation
    // type int
    'age' => 'int', // true

numeric

Validates on any numeric value.

    '20' => 'numeric', // true
    '-20' => 'numeric', // true
    '2.0' => 'numeric', // true

max & min

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

url

Validates if input is an URL:

    'http://example.com' => 'url', // true
    'https://www.youtube.com/watch?v=6FOUqQt3Kg0' => 'url', // true

boolean

Validates if the input is a boolean value:

    '1' => 'boolean', // true
    'true' => 'boolean', // true

date

Validates if input is a date:

    '20-01-2016' => 'date:d-m-y', // true
    '2016-01-20' => 'date:y-m-d', // true

lowercase

Validates if string characters are lowercase in the input:

    'peter parker 20' => 'lowercase', // true

uppercase

Validates if string characters are uppercase in the input:

    'PETER PARKER' => 'uppercase', // true

noWhitespace

Validates if a string contains no whitespace (spaces, tabs and line breaks);

    'Peter Parker' => 'noWhitespace', // false
    'Peter-Parker' => 'noWhitespace', // true

email

Validates an email address.

    'peter.parker@spiderman.com' => 'email', // true

phone

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

postalCode

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

equal

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', 

values

Validates if the input contains one of the following values.

    'Peter' => 'values:Peter,Parker,Spiderman', // true
    'Peter' => 'values:Parker,Spiderman', // false

same

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

length

Validates lengths.

    'Peter' => 'length:5', // true
    'Peter' => 'length:>4', // true
    'Peter' => 'length:<6', // true
    'Peter' => 'length:4,5', // true

image

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.

mimes

Validates if the file extension matches the expected one:

    'image.jpg' => 'mimes:jpg', // true

size

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

height & width

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

set

Validates if the input is set.

    // for $_POST & $_GET
    'firstName' => 'set', // true
    // php : if(isset($_POST['firstName'])) or if(isset($_GET['firstName'])) 

required

Check if the input is set and not empty

    // for $_POST & $_GET
    'firstName' => 'required', // true

requiredIf

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', 
       

requiredWith

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

requiredOneOf

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

with

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

oneOf

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

optional

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

optionalIf

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', 

skipIf

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', 

Assignation

add

     'name1::Peter' => 'add:end,Parker', // name1 = Peter Parker
     'name2::Parker' => 'add:begin,Peter', // name2 = Peter Parker

assign

     // 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
           

License

The JetFire Validator is released under the MIT public license : http://www.opensource.org/licenses/MIT.