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 相关文章推荐
一个显示天气预报的程序
Oct 09 PHP
人尽可用的Windows技巧小贴士之下篇
Mar 22 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
ThinkPHP关联模型操作实例分析
Sep 23 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
php中异常处理方法小结
Jan 09 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
如何使用php实现评委评分器
Jul 31 PHP
PHP图片添加水印功能示例小结
Oct 03 PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 PHP
php实现小程序支付完整版
Oct 09 PHP
简单实用的PHP文本缓存类实例
Mar 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
PHP读取xml方法介绍
2013/01/12 PHP
php简单压缩css样式示例
2016/09/22 PHP
php实现socket推送技术的示例
2017/12/20 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
Javascript中的this绑定介绍
2011/09/22 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
js+cavans实现图片滑块验证
2020/09/29 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
Python封装shell命令实例分析
2015/05/05 Python
Python中表示字符串的三种方法
2017/09/06 Python
Python交互环境下实现输入代码
2018/06/22 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
最新教师自我评价分享
2013/11/12 职场文书
办理退休介绍信
2014/01/09 职场文书
销售竞赛活动方案
2014/08/23 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
电影雷锋观后感
2015/06/10 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis