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 相关文章推荐
把从SQL中取出的数据转化成XMl格式
Oct 09 PHP
BBS(php &amp; mysql)完整版(三)
Oct 09 PHP
PHP SQLite类
May 07 PHP
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
PHP实现获取客户端IP并获取IP信息
Mar 17 PHP
PHP使用自定义方法实现数组合并示例
Jul 07 PHP
PHP+Ajax异步带进度条上传文件实例
Nov 01 PHP
php字符集转换
Jan 23 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 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
给多个地址发邮件的类
2006/10/09 PHP
php 读取文件乱码问题
2010/02/20 PHP
PHP 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
php 面向对象的一个例子
2011/04/12 PHP
php生成QRcode实例
2014/09/22 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
JavaScript浏览器选项卡效果
2010/08/25 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
bpython 功能强大的Python shell
2016/02/16 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
通过shell+python实现企业微信预警
2019/03/07 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
python用700行代码实现http客户端
2021/01/14 Python
世界上最好的帽子:Tilley
2016/11/27 全球购物
正隆泰信息技术有限公司上机题
2012/06/14 面试题
生产主管岗位职责
2013/11/10 职场文书
金融行业务员的自我评价
2013/12/13 职场文书
医院党员公开承诺书
2014/08/30 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL