Laravel FormRequest_表单请求验证封装【解答】

小晨酱_1024

小晨酱_1024

2026-05-05

944人浏览

原创

formrequest 是 laravel 最可靠易维护的表单验证方式,必须用于字段超3个含条件规则、store/update共用规则、需权限检查、需输入清洗等场景;authorize() 返回 false 会静默终止请求并返回403;prepareforvalidation() 预处理数据后,$request->all() 和 $request->validated() 均返回清洗值;自定义规则须实例化或用 rule::custom() 包装。

laravel formrequest_表单请求验证封装【解答】

FormRequest 是 Laravel 里最可靠、最易维护的表单验证方式——不是“可以选”,而是“该用就用”。它把规则、权限、预处理、错误消息全收进一个类,控制器只剩业务逻辑。

什么时候必须用 FormRequest 而不是 $request->validate()

别等项目大了再重构。以下任一情况出现,立刻建 FormRequest:

  • 表单字段超过 3 个,且含 required_if、required_unless、exclude_if 等条件规则
  • 同一套规则被 store 和 update 两个方法共用
  • 需要在验证前检查权限(比如只有管理员能提交 is_pinned 字段)
  • 要对输入做清洗:如自动 trim、转小写、过滤 HTML、把空字符串转为 null

authorize() 返回 false 却没报 403?

这是最常见的静默失败点。Laravel 不会“跳过”授权检查,而是直接终止请求流程——但如果你没留意响应状态码或日志,就会以为“验证没触发”。

laravel-specialist
laravel-specialist

精通 Laravel 10+,遵循现代 PHP 实践的 Laravel 专家。擅长优雅语法、Eloquent ORM、队列系统及企业级特性...

下载
  • 默认生成的 authorize() 方法返回 false,不改它,所有请求都会被拦截
  • 想放行,必须显式返回 true;要做权限判断,用 $this->user()->can('create', Post::class) 这类逻辑
  • 返回 false 后,Laravel 不执行 rules(),也不收集错误,直接返回 HTTP 403
  • 调试时可在 authorize() 里加 Log::debug('auth check') 确认是否运行到这步

验证通过后怎么拿到预处理过的数据?

很多人以为 $request->all() 就是原始输入,其实只要重写了 prepareForValidation(),它返回的就是清洗后的数据。

  • prepareForValidation() 在验证前执行,可修改 $data 数组,比如:$data['published_at'] = $data['published_at'] ?: null;
  • 验证通过后,$request->all()、$request->validated() 拿到的都是已处理过的值
  • 不要在控制器里再手动 array_filter 或 trim —— 那说明预处理逻辑没写对位置
  • 若需保留原始值作审计,可在 prepareForValidation() 中存到临时属性:$this->rawInput = $data;,然后在控制器里读取

自定义规则在 FormRequest 里不生效?

FormRequest 的 rules() 数组只认两种东西:字符串规则(如 'email')和实现了 Rule 接口的对象实例(如 new Uppercase)。

  • 用 php artisan make:rule Uppercase 生成规则类后,必须用 new Uppercase 实例化,不能写成字符串 'Uppercase'
  • 闭包式规则(如 function ($attribute, $value, $fail) { ... })不能直接塞进 rules 数组,得包装成 Rule::custom(...)
  • 全局注册的规则(用 Validator::extend())可以直接用字符串名,比如 'phone' => 'required|chinese_mobile',但前提是已在 AppServiceProvider@boot() 中注册
  • 规则名大小写敏感:chinese_mobile 和 ChineseMobile 是两个不同规则

FormRequest 的真正复杂点不在写法,而在“边界意识”:它不处理前端渲染、不决定重定向路径、不接管数据库保存——它只做一件事:确保流入控制器的数据干净、合法、符合上下文。漏掉 authorize()、错用规则语法、或在控制器里重复清洗,都是因为模糊了这个边界。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

857

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

835

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2468

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

3981

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

5670

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

3776

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

7109

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1416

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

215

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 206人学习

Composer手册
Composer手册

共0课时 | 0人学习