当前位置: 首页 > news >正文

构建一个简洁优雅的 PHP 参数验证器 —— php-schema-validator

在日常开发中,参数校验是绕不过的一道坎。我们常常需要确保用户传入的数据符合预期格式,比如必填字段、数据类型、最大长度、邮箱格式等等。虽然许多 PHP 框架都内置了验证器,但在开发轻量服务、非框架项目,或需要在业务中后端进行结构化数据校验时,我总觉得现有方案不够灵活、冗余较多。

于是,我动手写了一个开箱即用、易扩展、轻量级的参数验证器:php-schema-validator


为什么要造这个轮子?

虽然 PHP 社区有很多验证类库(如 Laravel 的 Validator、Respect\Validation、Opis JSON Schema 等),但它们往往:

  • 要么依赖框架,不方便独立使用;
  • 要么语法冗长,无法用简洁的规则表达复杂校验;
  • 要么扩展性差,自定义规则成本高。

我想要一个东西,既能用类似 JSON Schema 的方式表达规则,又能非常容易地扩展,同时尽量保持核心代码简洁明了。
于是这个项目诞生了。


核心设计理念

这个库的核心目标可以总结为三句话:

  1. 规则驱动 —— 用数组描述你的字段规则,声明式更直观;
  2. 可扩展 —— 每一个验证规则都是独立的类,插件化设计;
  3. 无依赖 —— 不依赖框架,适用于任意 PHP 项目。

安装方式很简单:

composer require hejunjie/schema-validator

一个简单示例:

use Hejunjie\SchemaValidator\Validator;
use Hejunjie\SchemaValidator\Exceptions\ValidationException;$data = ['name'   => '张三','age'    => 28,'email'  => 'invalid-email',
];// 自定义扩展,返回 true 则规则通过,否则均视为不通过
Validator::extend('is_zh', function ($field, $value, $params = null) {if (preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $value)) {return true;}
});try {Validator::validate($data, ['name'  => ['is_zh', 'string', 'minLength:2'],'age'   => ['integer', 'between:18,60'],'email' => ['required', 'email'],]);echo "验证通过 ✅";
} catch (ValidationException $e) {echo "验证失败 ❌" . PHP_EOL;print_r($e->getErrors());  // 友好打印错误信息
}

输出类似:

验证失败 ❌
Array
([email] => Array([0] => email))

支持的验证规则

目前内置了这些基础规则(并持续扩展中):

  • 类型类:支持 string / integer / boolean / array / object / float / numeric
  • 比较类:支持 min / max / between / length / min_length / max_length / gt / lt / gte / lte
  • 格式类:支持 email / mobile / url / ip / json / alpha / alpha_num / alpha_dash
  • 布尔类:支持 required / accepted / declined
  • 自定义类:支持 starts_with / ends_with / contains

如何扩展一个自定义规则?

比如我想加一个 is_zh(只允许输入中文)规则:

use Hejunjie\SchemaValidator\Validator;// 在调用 Validator::validate 之前
Validator::extend('is_zh', function ($field, $value, $params = null) {if (preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $value)) {return true;}
});

然后就可以直接使用:

use Hejunjie\SchemaValidator\Validator;
use Hejunjie\SchemaValidator\Exceptions\ValidationException;try {Validator::validate($data, ['name'  => ['is_zh'],]);// 验证成功
} catch (ValidationException $e) {// 验证失败
}

如果有常用自定义规则,建议在代码中封装 Validator::validate 方法,在调用 validate 之前通过 extend 方法注册自定义规则

在常驻内存的项目中,建议在项目运行初始化时全局注册,以减小性能开销


项目地址 & 使用方式

GitHub 仓库地址:
🔗 https://github.com/zxc7563598/php-schema-validator

欢迎 Star、提 Issue、提 PR!


下一步计划

我还在考虑以下几点:

  • 错误信息多语言支持
  • Laravel / Webman / Hyperf 插件适配
  • 添加更多内置规则(银行卡号、身份证号、UUID 等)
  • 将 schema 校验支持 YAML / JSON 文件描述

最后

这是一个“造轮子”项目,但也是一个“实践设计”的项目。如果你也曾因为参数验证的重复劳动而烦恼,不妨来试试这个轻量、可扩展的验证器。

如果这个库对你有帮助,欢迎 Star、提建议或一起共建 🚀

http://www.xdnf.cn/news/1257499.html

相关文章:

  • concurrentqueue:一个高并发高性能的C++无锁队列
  • 计算机视觉(opencv)——图像本质、数字矩阵、RGB + 基本操作(实战一)
  • 十八、k8s细粒度流量管理:服务网格
  • Netty知识储备:BIO、NIO、Reactor模型
  • 无人机未来的通信脉络:深度解析远距离无线通信模块的革新
  • Numpy科学计算与数据分析:Numpy数组操作入门:合并、分割与重塑
  • Spring Cloud系列—LoadBalance负载均衡
  • 剑指offer第2版——面试题1:赋值运算符函数
  • LINUX-批量文件管理及vim文件编辑器
  • AR技术:制造业质量控制的“智能革新”
  • OpenAI 开源模型 GPT-OSS深度拆解:从1170亿参数到单卡部署,重构AI开源生态
  • Claude Code MCP 网络搜索配置命令
  • Node.js特训专栏-实战进阶:21.Nginx反向代理配置
  • 开源软件与文化:从嬉皮士精神到数字时代的协同创新
  • 计算机网络1-5:计算机网络的性能指标
  • 浅析 Berachain v2 ,对原有 PoL 机制进行了哪些升级?
  • 水下管道巡检机器人cad【10张】三维图+设计说明书
  • OpenCv对图片视频的简单操作
  • KUKA库卡焊接机器人氩气节气设备
  • 深入剖析React框架原理:从虚拟DOM到Fiber架构
  • python安装部署rknn-toolkit2(ModuleNotFoundError: No module named ‘rknn_toolkit2‘)
  • 论文Review 激光实时动态物体剔除 DUFOMap | KTH出品!RAL2024!| 不上感知,激光的动态物体在线剔除还能有什么方法?
  • 基于Python的实习僧招聘数据采集与可视化分析,使用matplotlib进行可视化
  • 2025 最新 ECharts 下载、安装与配置教程
  • sigfillset 函数详解
  • 进程控制:进程的创建、终止、阻塞、唤醒、切换等生命周期管理操作
  • 二分查找算法,并分析其时间、空间复杂度
  • 翻译模型(TM):基于短语的统计翻译模型(PBSMT)的构建
  • 【算法训练营Day22】回溯算法part4
  • mysql_mcp_server_pro源码部署及启动报错新手指南:让智能体长出手来直接获取到最底层的数据