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&amp;mysql(三)
Oct 09 PHP
PHP 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP正确解析UTF-8字符串技巧应用
Nov 07 PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 PHP
php中的PHP_EOL换行符详细解析
Oct 26 PHP
php获取随机数组列表的方法
Nov 13 PHP
PHP正则表达式入门教程(推荐)
May 18 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
php 访问oracle 存储过程实例详解
Jan 08 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
Apr 23 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 高手之路(三)
2006/10/09 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
Vue 列表上下过渡效果的实例代码
2019/06/25 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
python定时器使用示例分享
2014/02/16 Python
在Django的视图中使用form对象的方法
2015/07/18 Python
Python如何生成树形图案
2018/01/03 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
Farah官方网站:男士服装及配件
2019/11/01 全球购物
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
Linux中如何用命令创建目录
2016/12/02 面试题
地球一小时宣传标语
2014/06/24 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
医院消毒隔离制度
2015/08/05 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
导游词之太湖
2019/10/08 职场文书