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 命名空间实例说明
Jan 27 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
php 地区分类排序算法
Jul 01 PHP
php对图像的各种处理函数代码小结
Jul 08 PHP
PHP三元运算的2种写法代码实例
May 12 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
php防止网站被攻击的应急代码
Oct 21 PHP
php格式化json函数示例代码
May 12 PHP
Yii针对添加行的增删改查操作示例
Oct 18 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
Jan 17 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中\r \r\n \t的区别示例介绍
2014/02/08 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
鼠标图片振动代码
2006/07/06 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
JSONP之我见
2015/03/24 Javascript
javascript实现table表格隔行变色的方法
2015/05/13 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
python解析xml文件操作实例
2014/10/05 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
python类继承用法实例分析
2015/05/27 Python
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
2014组织生活会方案
2014/05/19 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
优秀教师推荐材料
2014/12/16 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript