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 相关文章推荐
BBS(php &amp; mysql)完整版(三)
Oct 09 PHP
phpMyAdmin链接MySql错误 个人解决方案
Dec 28 PHP
关于PHP的curl开启问题探讨
Apr 08 PHP
PHP中copy on write写时复制机制介绍
May 13 PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
Oct 23 PHP
Linux安装配置php环境的方法
Jan 14 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
php中array_slice和array_splice函数解析
Oct 18 PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 PHP
PHP程序员必须知道的两种日志实例分析
May 14 PHP
PHP超全局变量实现原理及代码解析
Sep 01 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 jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
php实现字符串首字母转换成大写的方法
2015/03/17 PHP
php遍历CSV类实例
2015/04/14 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
vue实例的选项总结
2020/06/09 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
python类继承用法实例分析
2014/10/10 Python
python多线程threading.Lock锁用法实例
2014/11/01 Python
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
新郎父亲婚宴答谢词
2014/01/11 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
vue实现简易音乐播放器
2022/08/14 Vue.js