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 相关文章推荐
杏林同学录(八)
Oct 09 PHP
深入掌握include_once与require_once的区别
Jun 17 PHP
php获取bing每日壁纸示例分享
Feb 25 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
支付宝接口开发集成支付环境小结
Mar 17 PHP
简单谈谈PHP中strlen 函数
Feb 27 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
自制PHP框架之设计模式
May 07 PHP
PHP中md5()函数的用法讲解
Mar 30 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
Python中int()函数的用法浅析
2017/10/17 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
美国中小型企业领先的办公家具供应商:Office Designs
2016/11/26 全球购物
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
上班上网检讨书
2014/01/29 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
复活读书笔记
2015/06/29 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
销售会议开幕词
2016/03/04 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python