jetfirephp/validator

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

This package is not auto-updated.

Last update: 2024-09-14 17:48:28 UTC


README

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

安装

通过 composer

composer require jetfirephp/validator

使用

简单使用 \JetFire\Validator\Validator

require_once __DIR__ . '/vendor/autoload.php';

$response = \JetFire\Validator\Validator::isAlpha('Peter Parker');

// if not valid
if(!$response){
    // your code
    // ...
}

如果您要验证多个值,可以这样操作

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

如你所见,将值作为错误消息的键并不是很方便。如果您想为您的值添加键,您必须在值之前添加您的键,如下所示

$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 验证

对于 $_POST 验证,您必须像这样指定输入名称

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

对于 $_GET 验证,您必须使用 \JetFire\Validator\Validator::validateGet

自定义消息

您可以为验证设置自定义消息。您必须在 \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) 
]);

自定义规则

您可以像这样为验证创建自己的规则

\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 包含所有输入值(您可以通过 $request[$param] 获取当前输入值)

$param 是输入名称

$parameters 包含冒号后面的字符串

或者,您可以在数组中定义您的规则,并将其传递给 \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);

可用规则

以下是可用规则的列表

regex

对输入进行正则表达式评估并验证是否匹配

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

alpha

验证 a-Z 的字符

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

alnum

验证 a-Z 和 0-9 的字母数字字符

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

string

验证输入是否为字符串。

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

int

验证输入是否为整数。

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

numeric

验证任何数值。

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

max & min

验证输入值是否不超过最大值或是否大于最小值。

    '20' => 'max:30|min:10', // true
    '-20' => 'max:1|min:-30', // true

url

验证输入是否为 URL。

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

boolean

验证输入是否为布尔值。

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

date

验证输入是否为日期。

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

lowercase

验证输入中的字符串字符是否为小写。

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

uppercase

验证输入中的字符串字符是否为大写。

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

noWhitespace

验证字符串是否不包含空白(空格、制表符和换行符);

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

email

验证电子邮件地址。

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

phone

验证有效的 7 位、10 位或 11 位电话号码(北美、欧洲以及大多数亚洲和中东国家的电话号码),支持国家和区域代码(以点、空格或破折号表示),例如

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

根据给定的国家代码验证邮政编码。

   '75000' => 'postalCode:FR', // true
   '02179000' => 'postalCode:BR', // true
   '02179-000' => 'postalCode:BR', // true
   '02179-000' => 'postalCode:US', // false
   '55372' => 'postalCode:US', // true

equal

验证输入是否等于某个值。

    '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

验证输入是否包含以下值之一。

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

same

验证输入是否等于另一个输入。

    // for $_POST and $_GET validation
    // firstName = Peter
    'firstName' => 'alpha', // true 
    // lastName = Peter 
    'lastName' => 'same:firstName', // true

length

验证长度。

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

image

通过检查其 MIME 类型验证文件是否为有效的图像。

    'image.jpg' => 'image', // true
    // other supported MIME ['png', 'jpeg', 'gif', 'svg', 'bmp']

上述所有验证都必须返回 false,如果输入不是有效的文件或 MIME 类型与文件扩展名不匹配。

mimes

验证文件扩展名是否与预期的匹配

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

size

验证文件大小

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

验证图像高度或宽度

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

验证输入是否已设置。

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

required

检查输入是否已设置且不为空

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

requiredIf

如果字段满足某些条件,则该字段为必填。

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

输入为必填,需要与其它输入一起填写。

    '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

输入为必填,需与以下任一输入一起填写。

    '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

输入为可选,但以下输入不得为空。

    '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

输入为可选,但以下任一输入不得为空。

    '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

输入为可选,如果输入为空,则不执行以下规则。

    'firstName::' => 'optional|alpha|length:<20', // true
    'firstName::Peter' => 'optional|alpha|length:<20', // true
    'firstName::Peter 2' => 'optional|alpha|length:<20', // false

optionalIf

如果满足某些条件,则输入为可选。

    '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

如果满足某些条件,则跳过输入规则。

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

赋值

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
           

许可证

JetFire Validator 以 MIT 公共许可证发布:https://open-source.org.cn/licenses/MIT