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 相关文章推荐
PHP4 与 MySQL 数据库操作函数详解
Oct 09 PHP
PHP+MYSQL 出现乱码的解决方法
Aug 08 PHP
php 无法载入mysql扩展
Mar 12 PHP
PHP+Mysql+jQuery实现动态展示信息
Oct 08 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
使用php实现快钱支付功能(涉及到接口)
Jul 01 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
Sep 28 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 PHP
PHP入门教程之数学运算技巧总结
Sep 11 PHP
php和redis实现秒杀活动的流程
Jul 17 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 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 MemCached高级缓存配置图文教程
2010/08/05 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
jQuery设置和获取HTML、文本和值示例
2014/07/08 Javascript
详解JS函数重载
2014/12/04 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
jquery实现手机号码选号的方法
2015/07/31 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
Python连接DB2数据库
2016/08/27 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
python小项目之五子棋游戏
2019/12/26 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
旧时光糖果:Old Time Candy
2018/02/05 全球购物
专升本个人自我评价
2013/12/22 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
离职报告格式
2014/11/04 职场文书
公务员年终个人总结
2015/02/12 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python