zoukankan      html  css  js  c++  java
  • TP中使用laravel那一套验证

    ---恢复内容开始---

    1,tp5项目下新建一个extends目录,同时在入口文件index.php配置

    define('EXTEND_PATH', '../extend/');

    结果:

    2,加载laravel里面涉及的illuminate包,更改composer。json文件 以后(如下),composer update

     1 {
     2     "name": "topthink/think",
     3     "description": "the new thinkphp framework",
     4     "type": "project",
     5     "keywords": [
     6         "framework",
     7         "thinkphp",
     8         "ORM"
     9     ],
    10     "homepage": "http://thinkphp.cn/",
    11     "license": "Apache-2.0",
    12     "authors": [
    13         {
    14             "name": "liu21st",
    15             "email": "liu21st@gmail.com"
    16         }
    17     ],
    18      "repositories": {
    19         "packagist": {
    20             "type": "composer",
    21             "url": "https://packagist.phpcomposer.com"
    22         }
    23     },
    24     "require": {
    25         "php": ">=5.4.0",
    26         "topthink/framework": "^5.0",
    27         "topthink/think-image": "^1.0",
    28         "topthink/think-captcha": "^1.0",
    29         "topthink/think-mongo": "^1.0",
    30         "topthink/think-migration": "^1.0",
    31         "topthink/think-angular": "^1.0",
    32         "topthink/think-sae": "^1.0",
    33         "topthink/think-worker": "^1.0",
    34         "topthink/think-queue": "^1.0",
    35         "topthink/think-testing": "^1.0",
    36         "illuminate/validation": "^5.5",
    37         "illuminate/translation": "5.5.*",
    38         "illuminate/database": "^5.5",
    39         "douyasi/identity-card": "~2.0"
    40     },
    41     "extra": {
    42         "think-path": "thinkphp"
    43     },
    44     "config": {
    45         "preferred-install": "dist"
    46     }
    47 }
    View Code

    3,在extend文件夹下面新建一个Validator.php 

    <?php
    namespace validator;
    //use exceptionValidatorException;
    use IlluminateDatabaseCapsuleManager;
    use IlluminateValidation;
    use IlluminateFilesystem;
    use IlluminateTranslation;
    use IlluminateValidationDatabasePresenceVerifier;
    use thinkException;
    use DB;
    use DouyasiIdentityCardID;
    
    class Validator
    {
        static $factory = null;
    
        /**
         * @param $data
         * @param $rules
         * @return array
         * @throws ValidatorException
         */
        public static function make($data, $rules)
        {
            $is_default = [];
            foreach($rules as $key=>$x)
            {
                $rules[$key] = preg_replace('/|default:[^|]+/', '', $x, 1, $match);
                if($match)
                {
                    preg_match('/|default:([^|]+)/', $x, $m);
                    if(isset($m[1]))
                    {
                        $is_default[$key] = $m[1];
                    }
                    else
                    {
                        $is_default[$key] = null;
                    }
                }
                else
                {
                    $is_default[$key] = null;
                }
            }
    //        var_dump($is_default);die;
            if(self::$factory === null)
            {
                $filesystem = new FilesystemFilesystem();
                $fileLoader = new TranslationFileLoader($filesystem, THINK_PATH.'/../application/extra/');
                $translator = new TranslationTranslator($fileLoader, '/');
                $factory = new ValidationFactory($translator);
    
                $database = [
                    'driver'    => 'mysql',
                    'host'      => env('DB_HOST', '192.168.40.8'),
                    'database'  => env('DB_NAME', 'huolicai'),
                    'username'  => env('DB_USER', 'root'),
                    'password'  => env('DB_PASS', 'Abc@123456'),
                    'port'      => env('DB_PORT', '3306'),
                    'charset'   => 'utf8',
                    'collation' => 'utf8_unicode_ci',
                    'prefix'    => '',
                ];
                $connection = new Manager();
                $connection->addConnection($database);
                $connection->bootEloquent();
                $connection->setAsGlobal();
                $factory->setPresenceVerifier(new DatabasePresenceVerifier($connection->getDatabaseManager()));
    
                $factory->extend('list', function ($attribute, $value, $parameters, $validator) {
                    if(!is_array($value)) $value = explode(',', $value);
                    foreach($value as $item){
                        if($parameters[0] == 'integer' && !is_numeric($item))
                            throw new ValidatorException($attribute . ' 的每项必须为'.$parameters[0].'的类型', ValidatorException::BAD_VALIDATOR_PARAMS);
                    }
                    return true;
                });
    
                $factory->extend('csrf', function ($attribute, $value, $parameters, $validator) {
                    return $value == md5('SECRET.XXX'.	hinkRequest::instance()->ip());
                });
    
                $factory->extend('cellphone', function ($attribute, $value, $parameters, $validator) {
                    return preg_match('/^1(3|4|5|7|8|9)d{9}$/', $value);
                });
    
                $factory->extend('idcard', function ($attribute, $value, $parameters, $validator) {
                    $ID = new ID();
                    return $ID->validateIDCard($value);
                });
    
                $factory->extend('length', function ($attribute, $value, $parameters, $validator) {
                    return strlen($value) == ($parameters[0]??0);
                });
    
                $factory->extend('length_between', function ($attribute, $value, $parameters, $validator) {
                    return (strlen($value) > $parameters[0]??0 )&&(strlen($value) < $parameters[1] ?? 0);
                });
    
                $factory->extend('bankcard', function ($attribute, $value, $parameters, $validator) {
                    try{
                        $card = Bank::card($value);
            }catch(Exception $e){
        #        echo 'error_1';exit();
                        throw new ValidatorException('获取银行卡信息失败,请检查并重试', ValidatorException::BAD_VALIDATOR_PARAMS);
                    }
    
            if(!isset($card['validated']))
        #        echo 'error_2';exit();
                        throw new ValidatorException('获取银行卡信息失败,请检查并重试', ValidatorException::BAD_VALIDATOR_PARAMS);
            /*
                    if(!$card['validated'])
                        throw new ValidatorException('银行卡无效', ValidatorException::BAD_VALIDATOR_PARAMS);
            */
                    if($card['cardType'] == 'CC')
                        throw new ValidatorException('不支持信用卡', ValidatorException::BAD_VALIDATOR_PARAMS);
    
                    if(!isset(config('bank')[$card['bank']]))
                        throw new ValidatorException('不支持'.($card['bankName'] ?? $card['bank'] ?? '这张').'银行卡', ValidatorException::BAD_VALIDATOR_PARAMS);
    
                    return true;
                });
    
                $factory->extend('float_digits', function ($attribute, $value, $parameters, $validator) {
                    $value = (float) $value;
                    $string = (string) $value;
                    $divided = explode('.', $string);
                    if(!count($parameters) == 2)
                        throw new ValidatorException(null, ValidatorException::BAD_VALIDATOR_PARAMS);
    
                    if(!isset($divided[1]) && $parameters[0] == 0)
                        return true;
    
                    if(isset($divided[1]) && strlen($divided[1]) <= $parameters[1] && strlen($divided[1]) >= $parameters[0])
                        return true;
    
                    return false;
                });
    
                $factory->extend('exists_in', function ($attribute, $value, $parameters, $validator) {
                    if(($parameters[0] == true && trim($value)) || ($parameters[0] == false) ){
                        if(count($parameters) < 2) $parameters[1] = 'id';
    
                        $column = $parameters[1];
                        $exists = 	hinkDb::table($parameters[0])->where([$column => $value]);
                        if(isset($parameters[2]))
                        {
                            parse_str($parameters[2], $xx);
                            if($xx)
                            {
                                $exists = $exists->where($xx);
                            }
                        }
                        $attribute_name = config('validation.attributes')[$attribute] ?? $attribute;
    
                        $exists = $exists->find();
                        if(!$exists)
                            throw new ValidatorException($attribute_name.' 不存在', ValidatorException::BAD_VALIDATOR_PARAMS);
                    }
                    return true;
                });
    
                $factory->extend('unique_in', function ($attribute, $value, $parameters, $validator) {
                    if(($parameters[0] == true && trim($value)) || ($parameters[0] == false) ){
                        if(count($parameters) < 2) $parameters[1] = 'id';
    
                        $column = $parameters[1];
                        $exists = 	hinkDb::table($parameters[0])->where([$column => $value]);
                        if(isset($parameters[2]))
                        {
                            parse_str($parameters[2], $xx);
                            if($xx)
                            {
                                $exists = $exists->where($xx);
                            }
                        }
                        $attribute_name = config('validation.attributes')[$attribute] ?? $attribute;
    
                        $exists = $exists->find();
                        if($exists)
                            throw new ValidatorException($attribute_name.' 已存在', ValidatorException::BAD_VALIDATOR_PARAMS);
                    }
                    return true;
                });
    
                $factory->extend('exists_if', function ($attribute, $value, $parameters, $validator) {
                    if(($parameters[0] == true && trim($value)) || ($parameters[0] == false && !trim($value)) ){
                        if(count($parameters) < 3) $parameters[2] = 'id';
    
                        $column = $parameters[2];
                        $attribute_name = config('validation.attributes')[$attribute] ?? $attribute;
    
                        $exists = 	hinkDb::table($parameters[1])->where([$column => $value])->find();
                        if(!$exists)
                            throw new ValidatorException($attribute_name.' 不存在', ValidatorException::BAD_VALIDATOR_PARAMS);
                    }
                    return true;
                });
    
                $factory->extend('default', function ($attribute, $value, $parameters, $validator) {
                    return true;
                });
    
                $factory->extend('unique_if', function ($attribute, $value, $parameters, $validator) {
                    if(($parameters[0] == true && trim($value)) || ($parameters[0] == false && !trim($value)) ){
                        if(count($parameters) < 3) $parameters[2] = 'id';
    
                        $column = $parameters[2];
                        $attribute_name = config('validation.attributes')[$attribute] ?? $attribute;
    
                        $exists = 	hinkDb::table($parameters[1])->where([$column => $value])->find();
                        if($exists)
                            throw new ValidatorException($attribute_name.' 已存在', ValidatorException::BAD_VALIDATOR_PARAMS);
                    }
                    return true;
                });
    
                $factory->extend('null_if', function ($attribute, $value, $parameters, IlluminateValidationValidator $validator) {
                    $cond = $validator->getData()[$parameters[0]];
                    $match = false;
                    for($i = 1; $i < count($parameters); $i++)
                    {
                        if($cond == $parameters[$i]){
                            $match = true;
                            break;
                        }
                    }
                    if($match)
                    {
                        if(!empty($value) && $value !== 0 && $value !== '0') return false;
                    }
                    return true;
                });
    
                self::$factory = $factory;
            }else{
                $factory = self::$factory;
            }
    
            $messages = config('validation.custom');
            $validator = $factory->make($data, $rules, $messages);
            if($validator->fails())
            {
                throw new Exception(implode(',', $validator->errors()->all()), Exception::BAD_PARAMS);
            }
    
            $return = [];
            foreach($rules as $key=>$x)
            {
                $value = $data[$key] ?? $is_default[$key] ?? '';
                if(($value === NULL || $value === "") && $is_default[$key] !== NULL)
                {
                    $value = $is_default[$key];
                }
                if(null === $value || '' === $value)
                {
                }
                if(preg_match('/list:/', $rules[$key]))
                {
                    if(is_null($value)) $value = '';
                    $value = explode(',', $value); 
                }
                $return[] = $value;
            }
    
            return $return;
        }
    }
    View Code

     5,在controller里面写一个方法

    <?php

    namespace appindexcontroller;

    use validatorValidator;

    class Index
    {
    public function test1()
    {
    $handler = new Validator();
    $a = $handler->make(['user'=>142, 'phone'=>1,'name'=>'kevin'],[
    'user'=>'required|max:2',
    'phone'=>'required',
    'name'=>'required',
    // 'id'=>'required|idcard'
    ],[
    'phone.required' => 'phone不能为空',
    'name.required' => '姓名不能为空'
    ]);

    echo "验证通过";

    6,结果

     

    7,如何新增验证方法 : 大(比如增加一个idcard验证身份证的方法)

      第一步:在validator.php修改

        

        代码如下:

      
      $factory->extend('idcard', function ($attribute, $value, $parameters, $validator) {
                    $ID = new ID();
                    return $ID->validateIDCard($value);
                });
    View Code

        注意:为了能验证身份证,这里利用了第三方的包

          

        结果演示:

        

        

      

       

  • 相关阅读:
    Windows故障恢复控制台使用方法
    Windows XP SP2下安装WinCC V6.0 SP3 的安装步骤
    Windows Server2003 安装WinCC6.2 sp2
    pb6.5不兼容Oracle10g
    Windows Server 2003 Sp2 雨林木风版
    移动硬盘WINPE启动盘安装GHOST系统图解
    Vista硬盘安装详细图解
    系统的层次性与单一职责原则
    用dynamic增强C#泛型表达力
    谈单元测试的状态验证和行为验证
  • 原文地址:https://www.cnblogs.com/spicy/p/7867215.html
Copyright © 2011-2022 走看看