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 相关文章推荐
第十一节 重载 [11]
Oct 09 PHP
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 PHP
ThinkPHP写第一个模块应用
Feb 20 PHP
PHP的基本常识小结
Jul 05 PHP
php读取mysql的简单实例
Jan 15 PHP
php基于GD库画五星红旗的方法
Feb 24 PHP
Mac环境下php操作mysql数据库的方法分享
May 11 PHP
php获取系统变量方法小结
May 29 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 PHP
Yii CGridView用法实例详解
Jul 12 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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 验证码制作(网树注释思想)
2009/07/20 PHP
php输出表格的实现代码(修正版)
2010/12/29 PHP
php-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
php strftime函数的详细用法
2018/06/21 PHP
繁简字转换功能
2006/07/19 Javascript
javascript CSS画图之基础篇
2009/07/29 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
python实现井字棋游戏
2020/03/30 Python
Python中psutil的介绍与用法
2019/05/02 Python
简单了解Django ContentType内置组件
2019/07/23 Python
python计算无向图节点度的实例代码
2019/11/22 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
Python如何实现FTP功能
2020/05/28 Python
python中二分查找法的实现方法
2020/12/06 Python
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
Python的两道面试题
2013/06/29 面试题
部队2014年终工作总结
2014/11/27 职场文书
Python实现单例模式的5种方法
2021/06/15 Python
SQL 聚合、分组和排序
2021/11/11 MySQL