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中Object对象的笔记分享
Jun 28 PHP
PHP源码之explode使用说明
Aug 05 PHP
PHP+MySQL投票系统的设计和实现分享
Sep 23 PHP
基于curl数据采集之单页面采集函数get_html的使用
Apr 28 PHP
php在linux下检测mysql同步状态的方法
Jan 15 PHP
详解PHP中的null合并运算符
Dec 30 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
Mar 09 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
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
限制文本字节数js代码
2007/03/06 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
局部内部类是否可以访问非final变量?
2013/04/20 面试题
地理科学专业自荐信
2014/09/01 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
小学班主任评语
2014/12/29 职场文书
大学生自荐书范文
2015/03/05 职场文书
放假通知格式
2015/04/14 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书