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模拟js函数unescape的函数代码
Oct 20 PHP
is_uploaded_file函数引发的不能上传文件问题
Oct 29 PHP
php缩小png图片不损失透明色的解决方法
Dec 25 PHP
CodeIgniter模板引擎使用实例
Jul 15 PHP
Php连接及读取和写入mysql数据库的常用代码
Aug 11 PHP
php绘制圆形的方法
Jan 24 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
laravel手动创建数组分页的实现代码
Jun 07 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
php图片裁剪函数
Oct 31 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 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与浏览器缓存的分析
2013/06/03 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
搞定immutable.js详细说明
2016/05/02 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
Node.js简单入门前传
2017/08/21 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
vue中的inject学习教程
2019/04/24 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
python进阶教程之词典、字典、dict
2014/08/29 Python
跟老齐学Python之Python文档
2014/10/10 Python
粗略分析Python中的内存泄漏
2015/04/23 Python
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
代码中finally中的代码会不会执行
2012/02/06 面试题
超市优秀员工事迹材料
2014/05/01 职场文书
物理学专业求职信
2014/07/04 职场文书
项目工作说明书
2014/07/29 职场文书
个人委托书怎么写
2014/09/17 职场文书
通讯稿范文
2015/07/22 职场文书
外科护士长工作总结
2015/08/12 职场文书
高一语文教学反思
2016/02/16 职场文书
创业计划书之家教托管
2019/09/25 职场文书
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL