thinkphp5系列之模型验证

数据验证,是保证数据安全的有效方式,在thinkphp5中有着非常方便的模型验证数据,处理方式跟tp3有些不一样的地方,这里超人给出详细的解释和说明,以提供大家在说些的时候少走弯路...

thinkphp5模型验证手册地址:https://www.kancloud.cn/manual/thinkphp5/129355

模型验证我们可以有两种方式

使用验证器进行验证(tp5推荐使用的验证方式)

模型中直接验证


这里以栏目作为说明

以下截图是创建category控制器和模型

和模板页面

1502803029759291.png1502803180367836.png

验证器验证

thinkphp5验证器手册地址:https://www.kancloud.cn/manual/thinkphp5/129352

首先需要在application/admin下创建validate目录

该目录中创建Category.php

namespace app\admin\validate;

use think\Validate;

class Category extends Validate
{
   
}


控制器代码:

namespace app\admin\controller;

use think\Controller;

class Category extends Controller
{
   public function index ()
   {
      //判断post请求
      if ( request ()->isPost () ) {
         //实例化Category模型
         //模型返回的数据['code'=>1,'msg'=>'操作成功']
         //input ('post.')接受post提交数据
         $model = ( new \app\common\model\Category() )->store (input ('post.'));
         if ( $model[ 'code' ] ) {
            return $this->success ( $model[ 'msg' ] , 'index' );
         } else {
            return $this->error ( $model[ 'msg' ] );
         }
      }

      //渲染模板
      return view ();
   }
}

模型代码:

namespace app\common\model;

use think\Model;

class Category extends Model
{
   //主键
   protected $pk = 'id';
   //数据表,需要写表全名,如表前缀wb,那么这里需要写wb_category
    protected $table = 'category';

    public function store($data)
   {
      $result = $this->validate (true)->save ($data);
      if($result===false){
         return ['code'=>0,'msg'=>$this->getError ()];
      }
      return ['code'=>1,'msg'=>'栏目添加成功'];
   }
}

这里需要注意:

默认情况下验证器需要跟验证器名称一致

也就是模型为:Category.php,那么验证器名称:Category.php

验证器代码:

namespace app\admin\validate;

use think\Validate;

class Category extends Validate
{
   //定义验证规则
   protected $rule = [
      'cname'  =>  'require|length:4,25',
      'description' =>  'email',
   ];
   //定义提示消息
   protected $message = [
      'cname.require'  =>  '栏目名必须输入',
      'cname.length'  =>  '栏目名称需在4-25字符',
      'description.require' =>  '栏目描述必须输入',
   ];
}

验证器中$rule来定义验证规则

一个字段如如需多个规则验证使用管道符分割

thinkphp5内置规则:https://www.kancloud.cn/manual/thinkphp5/129356

提示消息【$message】可以不定义,这时候会有默认提示消息

$message可自定义提示信息内容


如果需要调用的验证器类【Cate.php】和当前的模型名称不一致;

建议模型与对应的验证器名一致;

那么模型代码可以这样:

namespace app\common\model;

use think\Model;

class Category extends Model
{
   //主键
   protected $pk = 'id';
   //数据表,需要写表全名,如表前缀wb,那么这里需要写wb_category
    protected $table = 'category';

    public function store($data)
    {
      //调用Cate验证器类进行数据验证
      $result = $this->validate ('Cate')->save ($data);
      if($result===false){
         return ['code'=>0,'msg'=>$this->getError ()];
      }
      return ['code'=>1,'msg'=>'栏目添加成功'];
    }
}


验证时候同样也可以支持场景验证;

这时候验证器需要增加$scene在验证器中:

namespace app\admin\validate;

use think\Validate;

class Category extends Validate
{
   //定义验证规则
   protected $rule = [
      'cname'  =>  'require|length:4,25',
      'description' =>  'email',
   ];
   //定义提示消息
   protected $message = [
      'cname.require'  =>  '栏目名必须输入',
      'cname.length'  =>  '栏目名称需在4-25字符',
      'description.require' =>  '栏目描述必须输入',
   ];
   //定义场景
   protected $scene = [
      'store'   =>  ['cname','description'],
      'edit'  =>  ['description'],
   ];
}

此时模型验证时

可以这样使用

namespace app\common\model;

use think\Model;

class Category extends Model
{
   //主键
   protected $pk = 'id';
   //数据表,需要写表全名,如表前缀wb,那么这里需要写wb_category
    protected $table = 'category';

    public function store($data)
   {
      $result = $this->validate ('Category.store')->save ($data);
      if($result===false){
         return ['code'=>0,'msg'=>$this->getError ()];
      }
      return ['code'=>1,'msg'=>'栏目添加成功'];
   }
}

这样就可以在添加验证cname和description

而在编辑时候可以调用Category.edit只验证description

直接在模型中验证

这个时候不需要验证器了;

不需要创建validate/Category.php了

而将代码直接写在模型中即可

namespace app\common\model;

use think\Model;

class Category extends Model
{
   protected $pk = 'id';//主键
   //数据表,需要写表全名,如表前缀wb,那么这里需要写wb_category
    protected $table = 'category';

    public function store($data)
   {
      $result = $this->validate(
         [
            'cname'  =>  'require|length:4,25',
            'description' =>  'email',
         ],
         [
            'cname.require'  =>  '栏目名必须输入',
            'cname.length'  =>  '栏目名称需在4-25字符',
            'description.require' =>  '栏目描述必须输入',
         ]
      )->save($data);
      if($result===false){
         return ['code'=>0,'msg'=>$this->getError ()];
      }
      return ['code'=>1,'msg'=>'栏目添加成功'];
   }
}

这里跟验证器其实一样的

$this->validate()中

参数1定义验证规则

参数2定义提示信息


个人建议使用验证器进行验证

结构比较清晰

简化模型代码

有必要情况下可以使用场景验证更为方便

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动。

武斌博客 http://www.wubin.pro

Top