解析如何进行Laravel表单验证分层设计和验证场景应用
思考
我发现大多数的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
文件,写入如下代码:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Itwmw\Validate\Middleware\ValidateMiddlewareConfig; class ValidateServiceProvider extends ServiceProvider{ public function register() { ValidateMiddlewareConfig::instance() ->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表单验证分层设计和验证场景应用的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Laravel 是一款 PHP 框架,用于轻松构建 Web 应用程序。它提供一系列强大的功能,包括:安装: 使用 Composer 全局安装 Laravel CLI,并在项目目录中创建应用程序。路由: 在 routes/web.php 中定义 URL 和处理函数之间的关系。视图: 在 resources/views 中创建视图以呈现应用程序的界面。数据库集成: 提供与 MySQL 等数据库的开箱即用集成,并使用迁移来创建和修改表。模型和控制器: 模型表示数据库实体,控制器处理 HTTP 请求。

在使用CraftCMS开发网站时,常常会遇到资源文件缓存的问题,特别是当你频繁更新CSS和JavaScript文件时,旧版本的文件可能仍然被浏览器缓存,导致用户无法及时看到最新的更改。这个问题不仅影响用户体验,还会增加开发和调试的难度。最近,我在项目中遇到了类似的困扰,经过一番探索,我找到了wiejeben/craft-laravel-mix这个插件,它完美地解决了我的缓存问题。

想要学习 Laravel 框架,但苦于没有资源或经济压力?本文为你提供了免费学习 Laravel 的途径,教你如何利用网络平台、文档和社区论坛等资源,从入门到掌握,为你的 PHP 开发之旅奠定坚实基础。

Laravel 提供了一个全面的 Auth 框架,用于实现用户登录功能,包括:定义用户模型(Eloquent 模型)创建登录表单(Blade 模板引擎)编写登录控制器(继承 Auth\LoginController)验证登录请求(Auth::attempt)登录成功后重定向(redirect)考虑安全因素:哈希密码、防 CSRF 保护、速率限制和安全标头。此外,Auth 框架还提供重置密码、注册和验证电子邮件等功能。详情请参阅 Laravel 文档:https://laravel.com/doc

文章摘要:本文提供了详细分步说明,指导读者如何轻松安装 Laravel 框架。Laravel 是一个功能强大的 PHP 框架,它 упростил 和加快了 web 应用程序的开发过程。本教程涵盖了从系统要求到配置数据库和设置路由等各个方面的安装过程。通过遵循这些步骤,读者可以快速高效地为他们的 Laravel 项目打下坚实的基础。

在面向初学者的 Laravel 框架版本选择指南中,本文深入探讨了 Laravel 的版本差异,旨在协助初学者在众多版本之间做出明智的选择。我们将重点介绍每个版本的关键特征、比较它们的优缺点,并提供有用的建议,帮助新手根据他们的技能水准和项目需求挑选最合适的 Laravel 版本。对于初学者来说,选择一个合适的 Laravel 版本至关重要,因为它可以显著影响他们的学习曲线和整体开发体验。

Laravel框架内置了多种方法来方便地查看其版本号,满足开发者的不同需求。本文将探讨这些方法,包括使用Composer命令行工具、访问.env文件或通过PHP代码获取版本信息。这些方法对于维护和管理Laravel应用程序的版本控制至关重要。

Laravel 和 ThinkPHP 都是流行的 PHP 框架,在开发中各有优缺点。本文将深入比较这两者,重点介绍它们的架构、特性和性能差异,以帮助开发者根据其特定项目需求做出明智的选择。
