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的类 功能齐全的发送邮件类
Oct 09 PHP
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
php 无法载入mysql扩展
Mar 12 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
PHP输出时间差函数代码
Jan 28 PHP
基于php设计模式中工厂模式详细介绍
May 15 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
轻松掌握php设计模式之访问者模式
Sep 23 PHP
php+mysql+jquery实现日历签到功能
Feb 27 PHP
解决出现SoapFault (looks like we got no XML document)的问题
Jun 24 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
Aug 11 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 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
9个JavaScript评级/投票插件
2010/01/18 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
微信小程序实现留言板
2018/10/31 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
python多线程扫描端口示例
2014/01/16 Python
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
Python chardet库识别编码原理解析
2020/02/18 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
应用艺术毕业生的自我评价
2013/12/04 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
毕业生工作求职信
2014/06/30 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL