thinkphp5——验证与杂项

一 验证

ThinkPHP5.0验证使用独立的\think\Validate类或者验证器进行验证

独立验证

$data = [
 
    'name'=>'thinkphp',
     
];
     
$validate = Loader::validate('User'); // 使用助手函数实例化验证器 $validate = validate('User');
 
if(!$validate->check($data)){
 
    dump($validate->getError());
     
}
use think\Validate;     //引入验证类
$validate = new Validate([
    'name'=>'require|max:25',   
]);
 
$data = [
     
    'name'=>input('post.name'),
     
];
     
if (!$validate->check($data)) {
     
    dump($validate->getError());
     
}


验证器

这是推荐的验证方式,为具体的验证场景或者数据表定义好验证器类,直接调用验证类的check方法完成验证

验证器


这是推荐的验证方式,为具体的验证场景或者数据表定义好验证器类,直接调用验证类的check方法完成验证


在需要进行User验证的地方,添加如下代码

3 验证规则

可以在实例化Validate类的时候传入验证规则

 

$rules = [
 
    'name'=>'require|max:25',
     
];
 
$validate = new Validate($rules);

也可以使用rule方法动态添加规则

$rules = [
 
    'name'=>'require|max:25',
     
];
     
$validate = new Validate($rules);
 
$validate->rule('zip','/^\d{6}$/');
 
$validate->rule([
 
    'email'=> 'email',
     
]);

属性定义

通常情况下,我们实际在定义验证类的时候,可以通过属性的方式直接定义验证规则等信息

namespace app\index\validate;
 
use think\Validate;
 
class User extends Validate{
 
    protected $rule = [
     
        'name'=>'require|max:25',
           
    ];
     
    protected $message = [
     
        'name.require' => '名称必须',
         
        'name.max' => '名称最多不能超过25个字符',   
    ];
}


验证数据

$data = [
 
    'name'=>'thinkphp',
   
];
 
$validate = Loader::validate('User');
 
if(!$validate->check($data)){
 
    dump($validate->getError());
     
}

自定义的错误信息

1 验证规则和提示信息分开定义

$rule = [
 
    'age'=>'number|between:1,120',
 
];
 
$msg = [
   
    'age.number'=>'年龄必须是数字',
     
    'age.between'=>'年龄必须在1~120之间',
   
];
 
$data = [
     
    'age'=>121,
     
];
 
$validate = new Validate($rule,$msg);
 
$result = $validate->check($data);
 
if(!$result){
 
    echo $validate->getError();
}

2 验证规则和提示信息一起定义

$rule = [
 
    ['age','number|between:1,120','年龄必须是数字|年龄必须在1~120之间'],
     
];
 
$data = [
    
    'age'=> 121,
 
];
 
$validate = new Validate($rule);
 
$result = $validate->check($data);
 
if(!$result){
 
    echo $validate->getError();
     
}

控制器验证

如果需要在控制器中进行验证,并且继承了\think\Controller的话,可以调用控制器类提供的validate方法进行验证

$result = $this->validate(
 
    [
        'name'=>'thinkphp',
    ],
     
    [
        'name'=>'require|max:25',
    ]
     
);
     
if(true!==$result){
     
    // 验证失败输出错误信息
     
    dump($result);
     
}

如果定义了验证器类的话

模型验证

$User = new User;$result = $User->validate(
 
    [
        'name'=> 'require|max:25',
    ],
     
    [
        'name.require'=> '名称必须', 
        'name.max'=>'名称最多不能超过25个字符',
        
    ])->save($data);
     
if(false === $result){
 
    // 验证失败输出错误信息
     
    dump($User->getError());
     
}

如果使用下面的验证器类的话

$User = new User;
 
$result = $User->validate(true)->save($data);  //调用当前模型对应的User验证器类进行数据验证
 
//$result = $User->validate('Member')->save($data); //调用Member验证器类进行数据验证
 
if(false === $result){
 
    // 验证失败输出错误信息
     
    dump($User->getError());
     
}


内置规则

格式验证类

'name'=>'require'              //验证段必须
 
'num'=>'number'               //验证是否为数字
 
'num'=>'float'                //验证是否为浮点数字
 
'num'=>'boolean'               //验证是否为布尔值
 
'email'=>'email'               //验证是否为email地址
 
'info'=>'array'                //验证是否为数组
 
'accept'=>'accepted'           //验证是否为 yes, on, 或是 1。这在确认"服务条款"是否同意时很有用
 
'date'=>'date'               //验证值是否为有效的日期
 
'name'=>'alpha'               //验证是否为字母
 
'name'=>'alphaNum'             //验证是否为字母和数字
 
'name'=>'alphaDash'            //验证是否为字母和数字,下划线_及破折号-
 
'name'=>'chs'                //验证只能是汉字
 
'name'=>'chsAlpha'             //验证只能是汉字、字母
 
'name'=>'chsAlphaNum'          //验证只能是汉字、字母和数字
 
'name'=>'chsDash'              //验证只能是汉字、字母、数字和下划线_及破折号-
 
'host'=>'activeUrl'            //验证是否为有效的域名或者IP
 
'url'=>'url'                //验证是否为有效的URL地址(采用filter_var验证)
 
'ip'=>'ip'                 //验证是否为有效的IP地址(采用filter_var验证)
 
'create_time'=>'dateFormat:y-m-d'    //验证是否为指定格式的日期

长度和区间验证类

'num'=>'in:1,2,3'         验证是否在某个范围
 
'num'=>'notIn:1,2,3'        验证不在某个范围
 
'num'=>'between:1,10'        验证是否在某个区间
 
'num'=>'notBetween:1,10'       验证不在某个范围
 
'name'=>'length:4,25'        验证字段的值的长度是否在某个范围
 
'name'=>'length:4          或者指定长度'
 
'name'=>'max:25'           验证字段的值的最大长度
 
'name'=>'min:5'            验证字段的值的最小长度
 
'begin_time' => 'after:2016-3-18',        验证字段的值是否在某个日期之后
 
'end_time'   => 'before:2016-10-01',       验证字段的值是否在某个日期之前
 
'expire_time'   => 'expire:2016-2-1,2016-10-01',  验证当前操作(注意不是某个值)是否在某个有效日期之内
 
'name'   => 'allowIp:114.45.4.55',       验证当前请求的IP是否在某个范围
 
'name'   => 'denyIp:114.45.4.55',        验证当前请求的IP是否禁止访问

字段比较类

'repassword'=>'require|confirm:password'            验证某个字段是否和另外一个字段的值一致
 
'name'=>'require|different:account'          验证某个字段是否和另外一个字段的值不一致
 
'score'=>'eq:100''num'=>'=:100''num'=>'same:100'   验证是否等于某个值
 
'score'=>'egt:60''num'=>'>=:100'             验证是否大于等于某个值
 
'score'=>'gt:60''num'=>'>:100'             验证是否大于某个值
 
'score'=>'elt:100''num'=>'<=:100'             验证是否小于等于某个值
 
'score'=>'lt:100''num'=>'<:100'              验证是否小于某个值
 
'price'=>'lt:market_price''price'=>'<:market_price'    验证对比其他字段大小(数值大小对比)
 
'ip'=>'filter:validate_ip'                   
 
'zip'=>'\d{6}',//或者'zip'=>'regex:\d{6}',        支持直接使用正则验证
 
'accepted'=>['regex'=>'/^(yes|on|1)$/i'],          如果你的正则表达式中包含有|符号的话,必须使用数组方式定义。

静态调用

Validate::dateFormat('2016-03-09','Y-m-d'); // true 日期格式验证
 
Validate::is('2016-06-03','date'); // true 验证是否有效的日期
 
Validate::is('thinkphp@qq.com','email'); // true 验证是否有效邮箱地址
 
Validate::in('a',['a','b','c']); // true 验证是否在某个范围
 
Validate::gt(10,8); // true 验证是否大于某个值
 
Validate::regex(100,'\d+'); // true 正则验证


验证规则支持对表单的令牌验证,首先需要在你的表单里面增加下面隐藏域:

<input type="hidden" name="__token__" value="{$Request.token}" />

或者

{:token()}



验证


protected $rule = [
     'name' => 'require|max:25|token',
     'email' =>'email',
];

二 杂项

1 缓存

ThinkPHP5采用think\Cache类提供缓存功能支持。
控制器里配置

$options = [
    
    'type'=>'File', // 缓存类型为File
    
    'expire'=>0, // 缓存有效期为永久有效
    
    'prefix'=> 'think',//缓存前缀
     
    'path'=>APP_PATH.'runtime/cache/',// 指定缓存目录
    
];
    
Cache::connect($options);

应用配置文件中配置

'cache'  => [

    'type' => 'File',
    
    'path' => CACHE_PATH,
    
    'prefix' => '',
    
    'expire' => 0,
    
],


支持的缓存类型包括file、memcache、wincache、sqlite、redis和xcache。 

//设置缓存

Cache::set('name',$value,3600); 设置缓存(有效期一个小时)如果设置成功返回true,否则返回false。

//缓存自增

Cache::inc('name');//name自增(步进值为1)

Cache::inc('name',3);//name自增(步进值为3)

//缓存自减

Cache::dec('name'); // name自减(步进值为1)

Cache::dec('name',3);// name自减(步进值为3)

//获取缓存

dump(Cache::get('name'));如果name值不存在,则默认返回 false。

dump(Cache::get('name',''));支持指定默认值 表示如果name值不存在,则返回空字符串。

//删除缓存

Cache::rm('name');

//获取并删除缓存

Cache::pull('name');如果name值不存在,则返回null。

//清空缓存

Cache::clear();

//不存在则写入缓存数据后返回

Cache::remember('name',function(){

	return time();
	
});

//获取缓存对象

$cache = Cache::init();// 获取缓存对象句柄

$handler = $cache->handler();

同时使用多个缓存类型

'cache'=> [
     
    'type'=>'complex',// 使用复合缓存类型
     
    'default'=>[ // 默认使用的缓存
        
        'type'=>'File', // 驱动方式
        
        'path'=>CACHE_PATH, // 缓存保存目录
    ],
   
    'file'=>[ //文件缓存
         
        'type'=>'file', // 驱动方式
         
        'path'=>RUNTIME_PATH.'file/',// 设置不同的缓存保存目录
    ],  
     
    'redis'=>[ //redis缓存
         
        'type'=>'redis',// 驱动方式
         
        'host'=>'127.0.0.1',// 服务器地址
    ],     
     
],

当使用

Cache::set('name','value'); 

Cache::get('name');

的时候,其实使用的是default缓存标识的缓存配置,如果需要切换到其它的缓存标识操作,可以使用:

Cache::store('file')->set('name','value');// 切换到file操作

2 session

ThinkPHP采用think\Session类提供Session功能支持

//赋值

Session::set('name','thinkphp');

Session::set('name','thinkphp','think');

//判断是否存在

Session::has('name');        // 判断(当前作用域)是否赋值

Session::has('name','think');// 判断think作用域下面是否赋值

//取值

Session::get('name');    // 当前作用域

Session::get('name','think'); // 取值think作用域如果name的值不存在,返回null。

//删除

Session::delete('name');// 删除(当前作用域)

Session::delete('name','think');// 删除think作用域下面的值

//指定作用域

Session::prefix('think'); // 指定当前作用域

//取值并删除

Session::pull('name');// 取值并删除如果name的值不存在,返回Null。

//清空

Session::clear(); // 清除session(当前作用域)

Session::clear('think');// 清除think作用域


Session::flash('name','value');// 设置session 并且在下一次请求之前有效


sessionSession::flush();// 清除当前请求有效的


//二级数组

//支持session的二维数组操作

Session::has('name.item');// 判断(当前作用域)是否赋值

Session::get('name.item');// 取值(当前作用域)

Session::delete('name.item');// 删除(当前作用域)

3 cookie

ThinkPHP采用think\Cookie类提供Cookie支持

//设置

Cookie::set('name','value',3600); // 设置Cookie 有效期为 3600秒

Cookie::set('name','value',['prefix'=>'think_','expire'=>3600]); // 设置cookie 前缀为think_

Cookie::set('name',[1,2,3]); // 支持数组

//判断

Cookie::has('name'); // 判断指定前缀的cookie值是否存在Cookie::has('name','think_');

//获取

Cookie::get('name');// 获取指定前缀的cookie值Cookie::get('name','think_');

//删除

Cookie::delete('name');// 删除指定前缀的cookie

Cookie::delete('name','think_');

//清空

cookieCookie::clear('think_');// 清空指定前缀的

4 多语言略

5 分页

$article = Db::name('article')->paginate(10);
 
$items = $article->items();
         
foreach ($items as $k => $v){   //foreach进行数据扩展
         
       $cateArr = Db::name('cate')->where('id',$items[$k]['cate'])->find();
                 
       $items[$k]['cate_name'] = $cateArr['name'];
}
 
$this->assign('items',$items);
         
$page = $article->render(); // 获取分页显示
        
$this->assign('page',$page);

模板显示分页

{$page}

6 上传

public function upload(){
     
    $file = request()->file('image'); // 获取表单上传文件
     
    // 移动到框架应用根目录/public/uploads/ 目录下
    if($file){
        $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
        if($info){
            // 输出 jpg
            echo $info->getExtension();
            // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
            echo $info->getSaveName();
            // 输出 42a79759f284b767dfcb2a0197904287.jpg
            echo $info->getFilename(); 
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }
    }}

7 验证码

<div>{:captcha_img()}</div>
 
<input type="text" name='code'>

控制器验证

$captcha = input('post.code');
 
if(!captcha_check($captcha)){
    ...
}


验证码的配置参数

配置文件

'captcha' => [
 
   'fontSize' => 20,// 设置验证码字体大小
    
]

 PS 如果使用了扩展内置的方法,务必在应用配置文件中配置,5.0.1及以上支持在应用配置目录下面extra子目录内配置captcha.php文件

图片处理 文件处理 单元测试 略

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值