解析如何进行Laravel表单验证分层设计和验证场景应用
发布时间 - 2021-07-29 00:00:00 点击率:次思考
我发现大多数的laravel用户会将验证规则写在controller下,但这会有一个问题,使代码杂乱且无法复用相同的规则。在crud为主的项目中,我们会发现好多字段以及它们的验证规则是相同的,我们一般会化身为cv工程师,再复制一份,那么为什么不加一层验证层?
伴随这个问题,然后去看了别的开源项目的代码,发现TP用户的验证会放在一个单独的类中,并且有验证场景来支持他们复用规则,于是我寻找Laravel中有没有对应的解决方案,然后发现了微擎的一个验证器w7/engine-validate,接下里的文章就依赖此扩展来讲如何增加一个验证层
安装
composer require w7/engine-validate
介绍
首先此验证器也是基于illuminate/validation的,关于它的详细说明可以直接查看它的文档,这里就不过多说明了。
使用
首先我们建立一个和控制器相对应的验证层
app ├── Http │ ├── Controllers │ │ └── UserController.php │ └── Validate │ └── UserValidate.php
验证器
验证器代码:
class UserValidate extends Validate{
protected $rule = [
'user' => 'required|email',
'pass' => 'required|alpha_num'
];
protected $message = [
'user.required' => '账号不可为空',
'pass.required' => '密码不可为空',
];
protected $customAttributes = [
'user' => '账号',
'pass' => '密码',
];}控制器代码:
class UserController extends BaseController{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function login(Request $request)
{
$data = UserValidate::make()->check($request->all());
}}这个时候,如果值不符合要求,会抛出一个ValidateException异常,我们可以选择手动捕获,也可以选择在异常捕获类里面做一个全局的处理:
public function render($request, Throwable $e)
{
if ($e instanceof ValidateException) {
return response()->json([
'code' => -1,
'message' => $e->getMessage()
]);
}
return parent::render($request, $e);
}这样我们就不需要再控制器里面管理任何的验证异常了
。
此时,控制器中的$data一定是符合我们需求的数据,然后可以紧接着做对应的业务处理
验证场景
这个时候,如果我们的UserController控制器中又添加了一个register方法,在以上两个字段的需求同时增加了name,应该如何处理呢?
我们可以使用类的$scene属性来指定某一场景下需要验证的字段
验证器代码修改如下:
class UserValidate extends Validate{
protected $rule = [
'user' => 'required|email',
'pass' => 'required|alpha_num',
'name' => 'required|alpha'
];
protected $message = [
'user.required' => '账号不可为空',
'pass.required' => '密码不可为空',
];
protected $customAttributes = [
'user' => '账号',
'pass' => '密码',
'name' => '用户名称',
];
protected $scene = [
'login' => ['user', 'pass'],
'register' => ['user', 'pass', 'name']
];}此时:login场景对应的验证user和pass字段,而register场景对应的验证user,pass,name字段
控制器代码修改如下:
class UserController extends BaseController{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function login(Request $request)
{
$data = UserValidate::make()->scene('login')->check($request->all());
}
public function register(Request $request)
{
$data = UserValidate::make()->scene('register')->check($request->all());
}}使用验证器的scene方法来指定当前需要验证的场景名称
验证中间件
默认我们一个控制器对应一个验证器,一个方法对应一个场景名称,基于此特点,我们可以编写一些更为简易的方法来解决验证,我们可以编写一个中间件来解决此问题,点击查看文档说明,中间件完整命名空间为:Itwmw\Validate\Middleware\Laravel\ValidateMiddleware
中间件设置
首先我们需要为他指定控制器和验证器的对应关系,在app/Providers目录下新建一个ValidateServiceProvider.php文件,写入如下代码:
setAutoValidatePath('App\\Http\\Controllers\\', 'App\\Http\\Validate\\');
}}其中setAutoValidatePath为指定控制器和验证器的对应关系,可以设定多个,不限制数量,然后我们将ValidateServiceProvider注册一下,在config/app.php文件中找到providers,在其中添加App\Providers\ValidateServiceProvider::class
注意:不可以放在Illuminate\Validation\ValidationServiceProvider::class之前
使用中间件
这个时候,我们可以将中间件注册为全局中间件,也可以不注册,注册方法:中间件《Laravel 7 中文文档》
定义路由:
Route::middleware(ValidateMiddleware::class)->group(function () {
Route::any('/login', [\App\Http\Controllers\UserController::class, 'login']);
Route::any('/register', [\App\Http\Controllers\UserController::class, 'register']);});控制器代码修改如下:
class UserController extends BaseController{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function login(Request $request)
{
$data = get_validate_data($request);
}
public function register(Request $request)
{
$data = get_validate_data($request);
}}这个时候,我们就不需要手动指定验证器已经场景名了,中间件会自动处理对应的验证规则,我们只需要使用get_validate_data方法来接收值即可。
结尾
此文章只写了这个扩展的一些基本用法,还有更多的功能,需要大家自己看看文档,来完成自己合适的验证层。
更多laravel技术文章,请访问laravel教程栏目!
# laravel
# 这个时候
# 我们可以
# 为空
# 方法来
# 文档
# 放在
# 就不
# 可以选择
# 复用
# 会有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Python高阶函数应用_函数作为参数说明【指导】
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
如何在腾讯云服务器上快速搭建个人网站?
用yum安装MySQLdb模块的步骤方法
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel PHP版本要求一览_Laravel各版本环境要求对照
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
javascript如何操作浏览器历史记录_怎样实现无刷新导航
Android实现代码画虚线边框背景效果
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
魔方云NAT建站如何实现端口转发?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
EditPlus中的正则表达式实战(5)
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Mybatis 中的insertOrUpdate操作
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
Laravel如何实现模型的全局作用域?(Global Scope示例)
iOS验证手机号的正则表达式
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Laravel定时任务怎么设置_Laravel Crontab调度器配置
教学论文网站制作软件有哪些,写论文用什么软件
?
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
如何快速重置建站主机并恢复默认配置?
青岛网站建设如何选择本地服务器?
如何将凡科建站内容保存为本地文件?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
香港服务器WordPress建站指南:SEO优化与高效部署策略
微信h5制作网站有哪些,免费微信H5页面制作工具?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
大型企业网站制作流程,做网站需要注册公司吗?
如何在服务器上三步完成建站并提升流量?
如何在IIS中配置站点IP、端口及主机头?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
如何批量查询域名的建站时间记录?
如何正确下载安装西数主机建站助手?
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel如何使用Eloquent进行子查询

