一 验证
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
文件
图片处理 文件处理 单元测试 略