webman 表单验证基于 webman/validation 扩展包的 validator 类,需通过 composer 安装、控制器中用 validate::make() 构建实例并调用 fails() 判断,规则如 email/integer 底层调 filter_var 但行为有差异,错误信息需手动配置 $messages 和 $attributes 实现中文化。

Webman 的表单验证器不是 PHP 原生的 filter_var 或 preg_match 封装,而是基于 Python 风格的声明式验证逻辑,必须配合 Webman 框架的路由和中间件机制才能生效——直接在普通 PHP 脚本里调用 FormValidator 会报错。
Webman 的 FormValidator 类不能脱离框架运行
你看到的 from webman import Form, StringField, IntegerField 是伪代码风格的示意,并非真实 PHP 语法。Webman 是 PHP 框架,但其文档中混用了 Python 式写法(如 class MyForm(Form)),容易让人误以为支持类继承式验证器定义。实际上:
- Webman 官方验证能力基于
webman/validation扩展包,核心是Validator类,不是FormValidator -
StringField、IntegerField等是 Python Web 框架(如 Flask-WTF)的概念,在 Webman 中不存在对应类 - 直接 new 一个所谓 “Form” 类并调用
validate(),PHP 会抛出Class 'Form' not found
Webman 正确启用验证的三步流程
要真正用上 Webman 的验证功能,得走标准扩展包路径:
- 先执行
composer require webman/validation安装验证组件 - 在控制器方法里用
Validator::make()构建验证器实例,传入$_POST数据和规则数组 - 调用
$validator->fails()判断是否失败,失败时用$validator->errors()取错误信息
示例代码片段:
use support\Validate;
$data = $_POST;
$rules = [
'email' => 'required|email',
'age' => 'required|integer|min:18|max:120',
'name' => 'required|string|min:2|max:20'
];
$validator = Validate::make($data, $rules);
if ($validator->fails()) {
$errors = $validator->errors()->all(); // 返回字符串数组
}
规则写法和 filter_var 的差异必须注意
Webman 的验证规则(如 email、integer)底层仍调用 filter_var,但行为不完全等价:
-
email规则实际调用filter_var($value, FILTER_VALIDATE_EMAIL),和手写一致 -
integer规则会先filter_var($value, FILTER_VALIDATE_INT),再检查范围,但不会自动 cast 成 int —— 若需强类型,得手动(int)$value -
string规则只是确保值不是 array/object,**不等价于is_string()**,它允许数字字符串(如"123")通过 - 正则校验要用
regex:/^1[3-9]\d{9}$/,斜杠必须包裹,漏掉会静默失效
错误信息中文化与字段名映射容易被忽略
默认错误提示是英文,且字段名显示为下划线格式(如 user_name 提示成 “User name is required”)。要控制输出,必须显式传入 $messages 和 $attributes:
-
$messages数组键为"email.required"这类完整规则路径,值为提示语 -
$attributes键为字段名(如"email"),值为中文别名(如"邮箱") - 不设
$attributes,即使规则写email,错误里仍显示原始字段名,用户看不懂
复杂点在于:Webman 验证器不自动过滤 $_POST 中的空字符串或 null 值,required 规则对 "" 和 null 都触发,但对 " "(纯空格)默认不触发 —— 得额外加 trim 规则或自己 array_map('trim', $_POST) 预处理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











