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空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
str_replace只替换一次字符串的方法
Apr 09 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 PHP
php生成txt文件标题及内容的方法
Jan 16 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
Jun 03 PHP
简单谈谈favicon
Jun 10 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
PHP自动补全表单的两种方法
Mar 06 PHP
PHP实现添加购物车功能
Mar 06 PHP
浅谈php(codeigniter)安全性注意事项
Apr 06 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
Apr 07 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
2021年最新CPU天梯图
2021/03/04 数码科技
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
jQuery Easyui快速入门教程
2016/08/21 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
python装饰器使用方法实例
2013/11/21 Python
详解Python3的TFTP文件传输
2018/06/26 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
python搜索算法原理及实例讲解
2020/11/18 Python
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
银行会计职员个人的自我评价
2013/09/29 职场文书
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
小学教师自我鉴定
2013/11/07 职场文书
公证书样本
2014/04/10 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
公司委托书格式范本
2014/09/16 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书