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运行SVN命令显示某用户的文件更新记录的代码
Jan 03 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
Dec 10 PHP
php实现中文转数字
Feb 18 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
Jul 20 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 PHP
php输出形式实例整理
May 05 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下使用strpos需要注意 === 运算符
2010/07/17 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
js中的getAttribute方法使用示例
2014/08/01 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
vue3.0生命周期的示例代码
2020/09/24 Javascript
python字符类型的一些方法小结
2016/05/16 Python
python交易记录链的实现过程详解
2019/07/03 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
利用python生成照片墙的示例代码
2020/04/09 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
文秘专业毕业生就业推荐信
2013/11/08 职场文书
中秋寄语大全
2014/04/11 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技