thinkphp5系列之模型验证

发布时间:1970-01-01  编辑:Mrs.默先森 

    数据验证,是保证数据安全的有效方式,在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定义提示信息


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

    结构比较清晰

    简化模型代码

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

    标签php nginx Linux


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

陶太富博客 http://blog.taotaifu.cn

最新发布

最新评论

0.087501s