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注入点构造代码
Jun 14 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
PHP 飞信好友免费短信API接口开源版
Jul 22 PHP
php修改时间格式的代码
May 29 PHP
php利用新浪接口查询ip获取地理位置示例
Jan 20 PHP
php数组中包含中文的排序方法
Jun 03 PHP
thinkphp模板继承实例简述
Nov 26 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
Feb 04 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 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语法(1)
2006/10/09 PHP
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
PHP 多维数组排序(usort,uasort)
2010/06/30 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
PyQt5实现简易计算器
2020/05/30 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
2014元旦晚会策划方案
2014/02/19 职场文书
师德标兵事迹材料
2014/12/19 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
好员工观后感
2015/06/17 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android