ThinkPHP类似AOP思想的参数验证的实现方法


Posted in PHP onDecember 18, 2019

思路讲解:不管是在开发 API 还是做后台项目的时候,后端永远不要相信前端传输的参数,通常要做的是验证参数的合法性和安全性。那么在实际项目开发的时候,怎么简便的验证参数呢。TP 提供了好几种参数验证的方式,比如验证器,独立验证,又或者在继承 Controller 基类的情况下使用 validate 方法。相比而言,验证器还是最佳选择。一个控制器有多个方法,也就表示有多个请求,也就表示有多个场景。一个项目不止一个控制器,那就表示不止需要建立一个验证器。面向对象的思想,就需要我们建立一个基类验证器,然后让子类继承就行了。那么怎么实现参数验证呢,下面我就介绍下类似 AOP 思想的参数验证的实现。

定义验证器基类

定义基类 app\common\validator\BaseValidator.php

<?php

namespace app\common\validator;

use app\common\exception\ParamException;
use think\Validate;

class BaseValidator extends Validate
{
  /**
   * @param string $scene
   * @return bool
   * @throws ParamException
   */
  public function checkParams($scene='')
  {
    $params = input('param.');
    $res = $this->scene($scene)->check($params);

    if( ! $res ){
      $error = $this->error;
      if(is_array($error)){
        $error = implode(',',$error);
      }
      throw new ParamException(['errMsg'=>$error,]);
    }
    return $res;
  }

  //自定义验证规则

}

定义验证器

<?php

namespace app\common\validator\user;

use app\common\validator\BaseValidator;

class UserValidator extends BaseValidator
{
  protected $rule =  [
    'name' => 'require|max:25',
    'age'  => 'number|between:1,120',
    'email' => 'email',
  ];

  protected $message =  [
    'name.require' => '名称必须',
    'name.max'   => '名称最多不能超过25个字符',
    'age.number'  => '年龄必须是数字',
    'age.between' => '年龄只能在1-120之间',
    'email'    => '邮箱格式错误',
  ];

  protected $scene = [
    'register' => ['name','email'],
  ];
}

验证参数

User.php 控制器 register 方法,实例化验证器,并进行场景验证。

public function register(Request $request){
    $validator = new UserValidator();
    $validator->checkParams('register');
    .
    .
    .
  }

至此,类似于 AOP 思想的参数验证就完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
用PHP和ACCESS写聊天室(二)
Oct 09 PHP
php中文字符截取防乱码
Mar 28 PHP
php文章内容分页并生成相应的htm静态页面代码
Jun 07 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
PHP Error与Logging函数的深入理解
Jun 03 PHP
php对csv文件的读取,写入,输出下载操作详解
Aug 10 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
CI框架给视图添加动态数据
Dec 01 PHP
PHP+jQuery翻板抽奖功能实现
Oct 19 PHP
PHP中类属性与类静态变量的访问方法示例
Jul 13 PHP
php mysql实现mysql_select_db选择数据库
Dec 30 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 #PHP
PHP中用Trait封装单例模式的实现
Dec 18 #PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 #PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 #PHP
Laravel等框架模型关联的可用性浅析
Dec 15 #PHP
php获取是星期几的的一些常用姿势
Dec 15 #PHP
Yii2框架中一些折磨人的坑
Dec 15 #PHP
You might like
解析php中如何直接执行SHELL
2013/06/28 PHP
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
初识Node.js
2015/03/20 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
Django自带的用户验证系统实现
2020/12/18 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
国际书籍零售商:Wordery
2017/11/01 全球购物
护士自荐信
2013/10/25 职场文书
班级活动策划书
2014/02/06 职场文书
生产文员岗位职责
2014/04/05 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
MySQL基础(二)
2021/04/05 MySQL
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
linux目录管理方法介绍
2022/06/01 Servers
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python