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开发入门教程之面向对象
Dec 05 PHP
php 中文字符入库或显示乱码问题的解决方法
Apr 12 PHP
Uncaught exception com_exception with message Failed to create COM object
Jan 11 PHP
基于PHP array数组的教程详解
Jun 05 PHP
PHP中trim()函数简单使用指南
Apr 16 PHP
PHP加密解密字符串汇总
Apr 26 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
php将html转为图片的实现方法
May 19 PHP
详解thinkphp中的volist标签
Jan 15 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
php中get_object_vars()在数组的实例用法
Feb 22 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/03/01 无线电
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
JavaScript在web自动化测试中的作用示例详解
2019/08/25 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
Python操作SQLite简明教程
2014/07/10 Python
python代码制作configure文件示例
2014/07/28 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
python爬取抖音视频的实例分析
2021/01/19 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
单位消防安全制度
2014/01/12 职场文书
数学国培研修感言
2014/02/13 职场文书
预备党员个人总结
2015/02/14 职场文书
行政撤诉申请书
2015/05/18 职场文书
张思德观后感
2015/06/09 职场文书
课题研究阶段性总结
2015/08/13 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
php解析非标准json、非规范json的方式实例
2022/05/10 PHP
volatile保证可见性及重排序方法
2022/08/05 Java/Android
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技