laravel基于FormRequest实现场景验证规则

2024-08-23 19:48

本文主要是介绍laravel基于FormRequest实现场景验证规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

在开发的过程中,经常会遇到表单验证的需求,Laravel为我们提供了功能强大且可拓展的验证器使我们可以快速实现此类需求,但是由于Laravel并没有为我们提供类似于 yii2的场景 的概念,这使得我们要为每一个
带有验证规则的请求都创建一个请求类文件,或将验证规则直接写在控制器中。这可能听起来没什么问题,但在实际开发中我们遇到非常复杂的业务场景,需要提供成百上千个接口,也就是说要创建成百上千个请求类文件或把成百上千个验证规则都写在控制器中。

为了解决这个问题,参考了 yii2的场景 ,尝试在Laravel中实现场景的概念,但是Laravel有很大的不同,在Laravel中自动验证的Requst类是注入进来的,这样想实现自动验证的时候就已经使用了正确的场景除非是通过表单提交的时候携带场景参数或者尝试使用Middleware进行处理,但这两种方式都不是太理想,经过一段时间的尝试和思考,想到可以利用变量名来传递场景信息。

于是开始实现,本想着很好解决,通过内置函数或者魔术函数或者反射类能轻松在类内部获取到这个类被实例化的名称,结果在这里浪费了很长很长时间,尝试了很多方式,但是依然没有办法获取实例名称。最后已经快放弃的时候。试到了可以通过Laravel路由来获取要到达的控制器类,再通过反射类来取到变量名称。

安装

composer require laravel-form-request/laravel-form-request

文档

表单请求基类 源码 测试用例

表单请求基类是抽象类,不能直接实例化使用,所有需要用到场景的请求类都需要继承该类。

表单请求基类继承自Laravel的 表单请求类 其中下面方法使用final关键字修饰,不能进行重写,需要使用场景名称+方法名称驼峰写法进行重写以实现不同场景使用不同的验证规则。

  • authorize()
  • rules()
  • messages()
  • attributes()

表单请求基类为上述方法使用默认场景提供了下面的重写方法,需要继承后重写自己的规则。

  • defaultAuthorize()
  • defaultRules()
  • defaultMessages()
  • defaultAttributes()

表单请求基类默认的场景是default,可以在子类中使用 const SCENARIO_DEFAULT = ‘login’ 修改默认场景名称,表单请求基类提供了以下方法获取和重新设置场景

  • getScenario()
  • setScenario(string $scenario)

表单请求基类重写了Laravel表单请求类的prepareForValidation方法以实现截取请求类的变量名称用作场景,prepareForValidation方法也使用final关键字修饰,不能进行重写。其中的主要功能都通过Laravel的路由来实现,所以如果请求不是通过路由构建的,无法使用此功能。
表单请求基类默认使用Request对变量进行截取,如$defaultRequest截取的场景名称为default,可以在子类中使用 protected $delimiter = ‘_request’; 修改默认分隔符。

下面以用户的表单请求类为例,介绍场景的使用,如下定义中定义了三个场景,分别是default index closure

use LaravelFormRequest\FormRequest;
class UserFormRequest extends FormRequest
{public function defaultRules(){return [];}public function defaultMessages(){return [];}public function indexRules(){return ['name' => 'required',];}public function indexMessages(){return ['name.required' => 'The name field is required in index scenario.',];}public function closureRules(){return ['name' => 'required',];}public function closureMessages(){return ['name.required' => 'The name field is required in closure scenario.',];}
}

然后在控制器中用同一个请求类进行定义,在请求到达控制器之前会根据变量名称转化成不同的场景规则进行验证

use Illuminate\Routing\Controller as BaseController;
class UserController extends BaseController
{public function index(UserFormRequest $request){echo $request->getScenario(); // default}public function index(UserFormRequest $indexRequest){echo $indexRequest->getScenario(); // index}
}

也可以不使用控制器,直接使用路由闭包的形式进行验证

Route::get('users', function (UserFormRequest $closureRequest) {echo $closureRequest->getScenario(); // closure
});

这篇关于laravel基于FormRequest实现场景验证规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100335

相关文章

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建