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

模板方法模式(Template Method):`FormRequest` 的 `authorize()` + `rules()` 是否定义了验证的算法骨架?

Laravel 的FormRequest类确实是模板方法模式(Template Method Pattern)在 Web 请求验证场景中的精妙应用。它通过定义验证流程的算法骨架(validateResolved(),并将具体授权逻辑(authorize())和验证规则(rules()延迟到子类实现,完美体现了模板方法模式的核心思想。


一、模板方法模式的核心思想(GoF 定义)

定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构即可重定义该算法的某些特定步骤

  • AbstractClass(抽象类):定义模板方法(templateMethod())和抽象/钩子方法;
  • ConcreteClass(具体子类):实现抽象方法,定制算法步骤;
  • 关键算法结构由父类控制,具体步骤由子类实现

FormRequest中:

  • AbstractClass=FormRequest(本身是具体类,但扮演抽象角色);
  • Template Method=validateResolved()(定义验证骨架);
  • Primitive Operations=authorize()rules()(由子类实现)。

二、FormRequest的模板方法实现

1.算法骨架:validateResolved()

这是验证流程的“模板方法”,定义在FormRequest的父类Request中(Laravel 8+ 位于ValidatesWhenResolvedTrait):

// Illuminate\Foundation\Http\FormRequestpublicfunctionvalidateResolved(){// 1. 执行授权检查if(!$this->passesAuthorization()){$this->failedAuthorization();}// 2. 执行验证规则$validator=$this->getValidatorInstance();if($validator->fails()){$this->failedValidation($validator);}}

这就是固定的算法骨架:先授权,再验证。

2.可定制步骤:authorize()rules()

子类必须实现这两个方法:

// App\Http\Requests\UpdateUserRequestclassUpdateUserRequestextendsFormRequest{// 钩子方法 1:授权逻辑publicfunctionauthorize(){return$this->user()->can('update',$this->route('user'));}// 钩子方法 2:验证规则publicfunctionrules(){return['name'=>'required|string|max:255','email'=>'required|email|unique:users,email,'.$this->route('user'),];}}
3.执行流程(由 Laravel 内核触发)
  1. 请求进入控制器方法(如update(UpdateUserRequest $request));
  2. Laravel自动调用$request->validateResolved()
  3. validateResolved()按顺序调用:
    • $this->passesAuthorization()→ 调用子类的authorize()
    • $this->getValidatorInstance()→ 调用子类的rules()
  4. 根据结果决定是否抛出异常(403 或 422)。

🔑开发者只需关注“做什么”(authorize/rules),框架控制“怎么做”(validateResolved


三、为什么这是模板方法,而非简单继承?

特性普通继承模板方法模式
算法控制权子类完全控制父类控制流程,子类提供步骤
扩展点任意重写方法仅开放特定钩子(authorize,rules
稳定性易被子类破坏流程骨架固定,子类无法绕过授权或验证

FormRequest强制子类遵循“先授权、再验证”的安全流程,这是模板方法的核心价值。


四、与你工程理念的深度对齐

你的原则FormRequest中的体现
关注点分离授权(Policy)、验证(FormRequest)、业务(Controller)各司其职
避免重复验证骨架由框架提供,无需在每个控制器写if/validate
可维护性修改验证流程只需调整validateResolved()(框架层),业务代码不变
安全性强制先授权后验证,避免逻辑漏洞
SOLID 遵循符合开闭原则:对扩展开放(自定义authorize/rules),对修改关闭(骨架固定)

五、高级技巧:扩展模板方法

1.自定义验证后逻辑
protectedfunctionpassedValidation(){// 在验证通过后、控制器执行前运行$this->merge(['slug'=>Str::slug($this->name)]);}
2.自定义错误格式
protectedfunctionfailedValidation(Validator$validator){thrownewHttpResponseException(response()->json(['errors'=>$validator->errors()],422));}
3.复用验证规则
// 在多个 FormRequest 中复用规则traitUserValidationRules{publicfunctionrules(){return['name'=>'required','email'=>'email'];}}

模板方法提供扩展点,但不强制复杂继承


六、与其他模式的协同

  • 与策略模式协同rules()返回的规则数组可视为“验证策略”;
  • 与工厂模式协同getValidatorInstance()是验证器的工厂方法;
  • 与观察者模式协同:验证失败触发异常,可被全局异常处理器捕获。

FormRequest是多种模式的协同典范,但模板方法是其架构主干


结语

Laravel 的FormRequest是模板方法模式在现代 Web 框架中的优雅实现。它通过:

validateResolved()(模板方法) +authorize()/rules()(钩子方法)

实现了:

  • 验证流程的标准化与安全固化
  • 业务逻辑的灵活定制
  • 代码的高内聚、低耦合

正如你所坚持的:好的框架不是替你思考,而是为你提供思考的脚手架
FormRequest正是这样一个脚手架——它定义了“验证必须先授权”的铁律,却将“如何授权、验证什么”交还给开发者,这正是模板方法模式的精髓所在。

http://www.jsqmd.com/news/142918/

相关文章:

  • 29、SQL数据处理全解析
  • 2025广州留学中介诚信榜单:权威测评,优选靠谱服务机构 - 留学品牌推荐官
  • PaddlePaddle镜像中的问答系统构建实战指南
  • 32、.NET泛型、应用配置与动态加载知识详解
  • Hap QuickTime编解码器终极指南:3种安装方法与性能优化技巧
  • Qwen快速图像生成:三步操作法的ComfyUI工作流教程
  • leetcode 787. Cheapest Flights Within K Stops K 站中转内最便宜的航班
  • 智能小车避障功能背后的电机驱动技术——L298N解析
  • PyGMTSAR 终极指南:5步掌握卫星干涉测量核心技术
  • 迭代器模式(Iterator):Eloquent 的 `cursor()` 方法如何实现内存高效的逐条遍历?它与 `Collection` 的遍历有何不同?
  • 2025橡胶支座厂家推荐排行榜:从产能到专利衡水正华优势尽显 - 爱采购寻源宝典
  • 终极免费指南:B站推送机器人让QQ群实时同步UP主动态
  • 实时火焰检测CNN:从零部署的完整实战指南
  • 2025年靠谱的风冷一体化加热器厂家最新权威实力榜 - 品牌宣传支持者
  • PaddlePaddle镜像集成开发环境(IDE)配置建议
  • 江苏省徐州市自建房设计公司/机构权威测评推荐排行榜 - 苏木2025
  • 微信商城小程序到底要花多少钱?资深小程序服务商为您拆解成本!
  • 2025电力电缆厂家推荐排行榜:从产能与专利看智达云强、徐工电缆实力 - 爱采购寻源宝典
  • WordPress Markdown编辑器WP-Editor.md:让写作回归纯粹与高效
  • 文本差异对比技术实战:从业务痛点到企业级解决方案
  • 一文搞懂大模型的知识蒸馏(Knowledge Distillation)
  • MUI框架用户反馈系统终极指南:打造高效用户沟通渠道
  • 宇宙的隐形脉搏:洞悉“场”的奥秘
  • PaddlePaddle镜像能否用于虚拟主播驱动?技术路径清晰
  • :2025石雕厂家推荐排行榜:从产能到质量,这5家凭实力出圈(产能+专利+质量) - 爱采购寻源宝典
  • Obsidian日历插件:重塑你的笔记时间管理体系
  • 33、.NET 应用配置与动态加载全解析
  • 医疗数据血缘追踪漏节点 补自动化工具救回分析
  • 一劳永逸!RWTS-PDFwriter:macOS虚拟打印机完美解决方案
  • edge-tts语音合成WebSocket连接403错误的完整解决方案指南