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

相关文章

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.