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 相关文章推荐
mysql建立外键
Nov 25 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 PHP
php中autoload的用法总结
Nov 08 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
Jul 05 PHP
php动态函数调用方法
May 21 PHP
学习php设计模式 php实现观察者模式(Observer)
Dec 09 PHP
PHP实现批量上传单个文件
Dec 29 PHP
PHP基于SMTP协议实现邮件发送实例代码
Apr 27 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
PHP笛卡尔积实现算法示例
Jul 30 PHP
PHP7 整型处理机制修改
Mar 09 PHP
一次项目中Thinkphp绕过禁用函数的实战记录
Nov 17 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的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
浅谈php命令行用法
2015/02/04 PHP
PHP7.0版本备注
2015/07/23 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
javascript cookies操作集合
2010/04/12 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
7个去伪存真的JavaScript面试题
2016/01/07 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
Angular组件化管理实现方法分析
2017/03/17 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
Vue实现简单分页器
2018/12/29 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
Python ftp上传文件
2016/02/13 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
python 反向输出字符串的方法
2018/07/16 Python
Python异常处理操作实例详解
2018/08/28 Python
若干个Java基础面试题
2015/05/19 面试题
节水倡议书范文
2014/04/15 职场文书
复活读书笔记
2015/06/29 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL