Laravel怎么做表单验证_Laravel怎么自定义验证规则【示例】
表单验证常见问题包括:验证失败不跳转需检查$request->validate()正确调用;复用规则推荐使用FormRequest类;自定义规则需在AppServiceProvider::boot()注册且名称全小写;中文提示不显示需确认config/app.php中locale设为'zh',并注意语言文件目录名。
在 Lara vel 开发中,表单验证这块看着简单,但坑可不少。很多新手甚至老手都被卡在几个常见问题上。今天把几个高频痛点拆开揉碎了聊聊,希望能帮你少走些弯路。
验证失败时页面不跳转、也不显示错误?检查 $request->validate() 是否在控制器里被正确调用
先说说最常见的坑:你明明写了验证规则,结果提交后页面直接跳过了验证,进了业务逻辑,甚至报了个 500。问题基本都出在 $request->validate() 上。这个方法一旦抛出 Illuminate\Validation\ValidationException 异常,Lara vel 会自动把请求重定向回上一页,并把错误信息塞进 $errors 变量让视图调用。但这里有几个关键点必须对位:
- 控制器方法得老老实实用
Illuminate\Http\Request实例,别自己去 new 一个 Request 或者直接用$_POST,框架不认 - 千万别把
validate()写在那种永远不会被执行的条件分支里,比如if (false) { $request->validate(...); },这种低级错误排查起来最费时间 - 如果用了
auth中间件,确保用户确实登录了。未登录状态下,中间件直接拦截了请求,验证方法根本没机会跑 - 视图里要显式输出错误信息,光靠 CSS 类名指望它自动冒出来是不行的。写一句
@error('email') {{ $message }} @enderror就够了
想复用验证规则又不想写重复数组?用 FormRequest 类而不是硬编码 validate()
有些朋友习惯把验证逻辑直接塞进控制器方法里,图省事。但长期来看,改个字段名要翻三四次文件,测试不好写,API 和 Web 的规则还得复制粘贴。Lara vel 的 FormRequest 就是专门来解决这个痛点的——规则、错误消息、授权判断全收在一个类里,自动注入,自动返回错误响应。
- 生成命令:
php artisan make:request StorePostRequest - 在
rules()方法里返回规则数组,比如return ['title' => 'required|string|max:255', 'content' => 'required']; - 控制器方法里直接类型提示:
public function store(StorePostRequest $request),框架会在进入方法前自动完成校验 - 特别提醒:
authorize()方法默认返回false,不修改的话所有请求都会被拒绝。简单场景直接改return true;就行
自定义验证规则总报 “Method does not exist”?注册位置和调用方式必须匹配
自定义规则这块,最容易出问题的是注册时机。闭包规则和独立规则类是两种常用方式,各自有各自的讲究。
- 闭包规则必须在
AppServiceProvider::boot()里注册,放构造函数或register()里都没用 - 规则名要全小写、无下划线,比如
'phone_zh',调用时也得写'phone_zh',写成'PhoneZh'或'phoneZh'都不行 - 独立规则类用
php artisan make:rule Uppercase生成,在passes()里写逻辑,message()里返回提示,使用时直接new Uppercase - 如果规则里需要查数据库,别在闭包里直接用
DB::,表单重填时容易因为缓存或连接问题失败。优先用 Rule 对象,或者把查询逻辑延迟到验证时再执行
中文提示不显示、总是英文?别只改 resources/lang/zh/validation.php
改完语言包还是英文?八成是 Lara vel 没加载到中文配置。有几点可以检查一下:
- 确认
config/app.php里的locale是'zh',而不是'zh-CN',后者 Lara vel 默认不认识 - 语言文件
resources/lang/zh/validation.php的目录名必须是zh,内容结构要严格匹配英文版的键名,比如'required' => ':attribute 为必填项' - 如果用了
FormRequest,它的messages()方法返回的数组会覆盖语言包的配置。调试时可以先注释掉这个方法,看看是不是这里出了问题 - AJAX 请求默认不携带
Accept-Language头,后端收不到 locale 信息,这时需要手动指定:$validator->setLocale('zh');
话说回来,真正麻烦的不是写规则本身,而是规则在不同场景下的行为差异——Web 表单要重定向、API 要 JSON 错误、队列里验证失败可能直接丢弃任务。边界情况处理好了,项目才能真正跑得稳。
WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许
Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator
Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。













