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脚本的10个技巧(3)
Oct 09 PHP
PHP4实际应用经验篇(6)
Oct 09 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
php设计模式之单例、多例设计模式的应用分析
Jun 30 PHP
初识PHP
Sep 28 PHP
PHP使用flock实现文件加锁的方法
Jul 01 PHP
php中二维数组排序问题方法详解
Aug 28 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
php中final关键字用法分析
Dec 07 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
Jan 30 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
PHP的PSR规范中文版
2013/09/28 PHP
php中的ini配置原理详解
2014/10/14 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
JQUERY获取form表单值的代码
2010/07/17 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
编写v-for循环的技巧汇总
2020/12/01 Javascript
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
使用python开发vim插件及心得分享
2014/11/04 Python
Python中的函数作用域
2018/05/07 Python
深入理解Django-Signals信号量
2019/02/19 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
python写程序统计词频的方法
2019/07/29 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
证券期货行业个人的自我评价
2013/12/26 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
房地产开发项目建议书
2014/05/16 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
搞笑老公保证书
2015/02/26 职场文书
Python实现位图分割的效果
2021/11/20 Python