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 相关文章推荐
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
php xml文件操作实现代码(二)
Mar 20 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 PHP
ThinkPHP之getField详解
Jun 20 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
基础的WordPress插件制作教程
Nov 24 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 PHP
php上传excel表格并获取数据
Apr 27 PHP
php实现的错误处理封装类实例
Jun 20 PHP
php获取是星期几的的一些常用姿势
Dec 15 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
PHP4.04简明安装
2006/10/09 PHP
在JavaScript中调用php程序
2009/03/09 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
Prototype Class对象学习
2009/07/19 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
原生js检测页面加载完毕的实例
2018/09/11 Javascript
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
2019/04/16 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
Python 文件读写操作实例详解
2014/03/12 Python
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
Python如何使用函数做字典的值
2019/11/30 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
校园新闻广播稿
2014/01/10 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
推广普通话演讲稿
2014/05/23 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python
基于Redis的List实现特价商品列表功能
2021/08/30 Redis
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python