文章目录

    • 校验器
      • 校验器类型
      • @Validate 注解
        • 属性说明
        • 校验器校验主要流程
        • 系统校验器每个属性存储结构
        • 校验器规则定义,注解、注解解析器定义
        • 校验器注解使用
      • 实现一个自定义的校验器
        • 校验器注解
        • 校验器注解解析器
        • 校验器规则
        • 系统校验器
        • Controller/Action 绑定校验器

校验器

校验器是 swoft2 中一个常用的组件。

校验器在 RPC服务、WS服务、HTTP 服务中均有涉及,用来校验客户端上传到服务端的数据是否合法。

校验器类型

校验器一般分为两种,系统校验器,和自定义校验器。

系统校验器是通过 @Validator 标签进行注解的一个校验器类(没有方法只有属性),每个属性上通过不同的注解(如:@Length @IsString )来说明校验时候参数要符合的规则。

自定义校验器,同样需要 @Validator 标签对校验的类进行注解,但是类必须要实现 ValidatorInterface 接口,只有实现接口validate(array $data, array $params),才会称为自定义校验器(源码中有此判断,参见:src/Annotation/Parser/ValidatorParser.php)。注意自定义校验器,只会校验 body 中数据,且自定义校验器,只会使用 body 中数据和 params,其他 @Validate 属性,并不会使用。

/*** Class CustomerValidator** @since 2.0** @Validator(name="userValidator")*/
class CustomerValidator implements ValidatorInterface
{/*** @param array $data		这是自定义校验器中* @param array $params** @return array* @throws ValidatorException*/public function validate(array $data, array $params): array{$start = $data['start'] ?? null;$end   = $data['end'] ?? null;if ($start === null && $end === null) {throw new ValidatorException('Start time and end time cannot be empty');}if ($start > $end) {throw new ValidatorException('Start cannot be greater than the end time');}return $data;}
}

@Validate 注解

属性说明
/*** Class** @since 2.0** @Annotation* @Target("METHOD")* @Attributes({*     @Attribute("validator", type="string"),*     @Attribute("fields", type="array"),*     @Attribute("params", type="array"),*     @Attribute("message", type="string"),* })*/
class Validate {}

以上为 @Validate 注解的参数要求,具体说明见下表:

注解参数参数类型是否必须备注
validator字符串已经定义好的校验器的名字
fields数组校验器中的属性(对应请求中的参数)。
不指定,默认校验校验器中所有属性。
如果指定的值在校验器中不存在,那么控制器中仍然可以接收到参数,但是不会有任何校验!!!
unfields数组不进行校验的属性
params数组用在自定义校验器中,用户手动传递到校验器的数据
注:自定义校验器时候才会使用
message字符串校验失败时候提示信息
type字符串校验数据所在请求对象中的位置(get/body/path)

@Validate 注解用于 method 上,示例:

// 示例1:通过系统默认校验器,校验 post 请求中的参数
/*** @RequestMapping("account")* @param Request $request* @param Response $response* @return Response* @throws InvalidArgumentException* @Validate(validator="userValidator", fields={"name", "password"}, type="body")*/
public function account(Request $request, Response $response): Response;// 示例2:通过系统默认的校验器校验自定义 path 参数/*** @RequestMapping(route="/[list-{page}.html|index.html]", params={"page"="[2-9]\d*|1\d+"}, method={"GET"})* @View("home/index")* @Validate(validator=PageListDto::class, fields={"page", "size"}, type="path")** @param Request $request* @param Response $response* @return Response*/
public function index(Request $request, Response $response): Response

注意:@Validate 的 type 参数十分重要,默认值为 body,也就是默认校验 post 请求参数。如果是校验 get 参数,或者自定义 path 中的自定义参数,必须要写明类型。否则校验出错。

校验器校验主要流程

以 HTTP 服务为例,可以参照 http-server 组件中的 src/Middleware/ValidatorMiddleware.php 中间件,此中间件可以通过定义核心 Bean 的方式,将其挂载到 HTTP 服务上。从相关代码可以看出,中间件运行期间,通过 ValidateRegister::getValidates()方法提取访问接口上绑定的校验器相关信息。

class ValidatorMiddleware implements MiddlewareInterface
{/*** @param ServerRequestInterface  $request* @param RequestHandlerInterface $handler** @return ResponseInterface* @throws ValidatorException*/public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface{// 获取路由匹配结果,如果未匹配成功,此中间件不做处理,交给下一个中间件。/* @var Route $route */[$status, , $route] = $request->getAttribute(Request::ROUTER_ATTRIBUTE);if ($status !== Router::FOUND) {return $handler->handle($request);}// 如果路由匹配成功,获取路由绑定的处理器(controller/action)// Controller and method$handlerId = $route->getHandler();[$className, $method] = explode('@', $handlerId);// 获取 controller/action 方法上通过注解绑定的校验器(可以多个)// Query validates$validates = ValidateRegister::getValidates($className, $method);// 如果没有,说明不用校验,交给下一个中间件处理if (empty($validates)) {return $handler->handle($request);}// 获取校验涉及的相关数据$data  = $request->getParsedBody();$query = $request->getQueryParams();$path  = $route->getParams();// ParsedBody is empty string$parsedBody    = $data = empty($data) ? [] : $data;$notParsedBody = !is_array($data);if ($notParsedBody) {$parsedBody = [];}// 获取校验器组件的实例对象/* @var Validator $validator */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909772.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909772.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909772.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 类型转换与加密函数深度解析

MySQL 类型转换与加密函数深度解析 一、类型转换函数详解 1. 显式类型转换 CAST 函数 CAST(expression AS type)支持类型:BINARY, CHAR, DATE, DATETIME, TIME, DECIMAL, SIGNED [INTEGER], UNSIGNED [INTEGER]示例:SELECT CAST(2023-08-15 AS DATE);…

FPGA基础 -- Verilog 行为级建模之条件语句

Verilog 的行为级建模(Behavioral Modeling)中的条件语句(Conditional Statements),逐步从基础到实际工程应用,适合有RTL开发基础但希望深入行为建模的人。 一、行为级建模简介 行为级建模(Beh…

linux618 NFS web.cn NFS.cn backup.cn

权限问题 推测 ssh root登录失败 root192.168.235.100s password: ▒▒▒ʱ▒▒ܾ▒ root192.168.235.100s password: ▒▒▒ʱ▒▒ܾ▒ root192.168.235.100s password: ▒▒▒ʱ▒▒ܾ▒ root192.168.235.100s password: ▒▒▒ʱ▒▒ܾ▒ root192.168.235.100s password: …

氧化镱:稀土科技的“夜视高手”

氧化镱(Yb₂O₃)是一种重要的稀土氧化物,这种略带黄色的粉末,既不像黄金那样耀眼,也不像稀土家族里的“明星”如钕、铽那样广为人知,却在背后默默支撑着许多高科技产业,特别是在红外技术领域&am…

class对象【C#】2025复习

对象 西方思想是:复杂的事让秘书去做就行。老板只需简单的下达命令。 代码格式如下 秘书类型 秘书A new 秘书类型(); . 秘书A.开始工作(); // 调用实例对象的方法。 特别注意的是,程序只会用到 秘书A,秘书B&…

Qt程序启动动画

一、Qt有3种方式实现程序启动动画(介绍) 1、QSplashScreen 静态图片(png、jpg等格式) 2、QMovie 动态图片(gif格式) 3、QAxWidget 视频(swf格式) 1.QSplashScreen 静态图片(png、jpg等格式) //创建启动动画类实例 QSplashScreen splash(QPixmap(&qu…

贪心算法经典问题

目录 贪心思想 一、Dijkstra最短路问题 问题描述: 贪心策略: 二、Prim 和 Kruskal 最小生成树问题 Prim 算法: Kruskal 算法: 三、Huffman树问题 问题描述: 贪心策略: 四、背包问题 问题描述&a…

零知开源——STM32F4实现ILI9486显示屏UI界面系列教程(一):电子书阅读器功能

本教程将详细介绍如何在零知增强板上使用3.5寸ILI9486显示屏实现电子书阅读器功能。我们将使用LVGL库构建用户界面,并实现翻页、进度显示等核心功能。 目录 一、硬件连接 二、软件UI组件实现 三、零知IDE配置 四、演示效果 五、常见问题解决 六、总结与扩展 一…

支持selenium的chrome driver更新到137.0.7151.119

最近chrome释放新版本:137.0.7151.119 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…

架构下的最终瓶颈:数据库如何破局?

在分布式系统和云原生架构逐渐成熟的当下,我们已能够灵活扩展计算资源、水平扩展服务节点、拆分业务模块等。然而,在经历过多轮架构优化之后,数据库常常成为系统的“最后瓶颈”。尤其当数据量、并发量、实时性要求剧增时,数据库即…

湖北理元理律师事务所小微企业债务重组方案:司法与经营的共生逻辑

小微企业债务问题常陷入“救企业还是保老板”的困局。湖北理元理律师事务所为某汽车零部件供应商设计的“经营性债务重组”方案,提供了创新解题思路。 核心矛盾拆解 该企业面临三重困境: 矛盾类型 具体表现 法律风险等级 担保链危机 老板个人担保牵…

FastAdmin退出登录不提示的修改方法

修改退出登录后的提示行为 在FastAdmin中,默认退出登录后会显示"退出成功"的提示信息并跳转页面。要实现不显示提示信息直接跳转,可以通过以下方式修改: 方法一:修改控制器逻辑 找到application/admin/controller/Log…

工信部发布《中国工业软件产业发展研究报告(2025)》:PLM垄断加剧,Ai为国产PLM软件发展契机

在6月17日上午举行的2025南京软件大会开幕式上,工信部电子第五研究所现场发布《中国工业软件产业发展研究报告(2025)》(以下简称《研究报告》),并从工业软件产业发展现状、产业发展趋势,以及我国…

Flutter JSON解析全攻略:使用json_serializable实现高效序列化

引言:为什么我们需要JSON序列化工具? 在现代移动应用开发中,与服务器进行数据交互是必不可少的功能。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读性、简洁性和广泛支持性&…

shelve模块的使用

shelve模块的使用 1. 什么是Shelve2. Shelve模块的数据存储与读取3. Shelve的读取数据4. Shelve模块的高级操作_ Shelve的数据更新和删除5. 删除操作可以使用del语句:6. Shelve的数据查询和处理_使用for循环来遍历Shelve对象中的所有键值对:7. Shelve模块…

python大学校园旧物捐赠系统

目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中&#xf…

Python爬虫实战:研究eventlet库相关技术

1. 引言 在当今信息爆炸的时代,网络上的数据量呈现出指数级增长的趋势。从海量的网络信息中获取有价值的数据并进行分析,对于企业决策、学术研究以及个人兴趣等方面都具有重要意义。网络爬虫作为一种自动化获取网页内容的技术手段,应运而生并得到了广泛的应用。 网络爬虫(…

文字识别接口-智能文本处理-文字提取技术

文字识别接口,顾名思义,就是一种将图像文字或手写文字转换为可编辑文本的技术。文字识别接口,基于深度学习算法与自主ocr核心实现多种场景字符的高精度识别与结构化信息提取,现已被广泛应用于银行、医疗、财会、教育等多个领域。 …

Redis的持久化机制详细解析

Redis的持久化机制详细解析 今天我们来聊聊Redis的持久化机制。想象一下,你正在玩一个非常精彩的游戏,突然断电了,如果没有存档功能,所有的进度都会丢失,是不是很崩溃? Redis作为内存数据库,同…

2025年SYN-CC混合攻击防御实战:某金融平台抵御800Gbps双重风暴实录

“你以为防住SYN Flood就能高枕无忧?新型SYN-CC混合链正在撕裂传统防御体系!” 一、事件现场:一场精准的“协议层绞杀” 2025年5月,某跨境支付平台遭遇史上首次SYN-CC混合攻击,峰值流量达 800Gbps,核心交易…