搜索
首页php框架Laravel解析如何进行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场景对应的验证userpass字段,而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中文网其他相关文章!

声明
本文转载于:learnku。如有侵权,请联系admin@php.cn删除
最新的Laravel版本:DIFES DISCON最新的Laravel版本:DIFES DISCONMay 12, 2025 am 12:15 AM

Laravel10IntroducessEveralKeyFeatUrestHatenHanceWebDevelopment.1)LazyCollectionsAllyCollefficeProcesingOflargeFlargedAtasetSwithSwithOutloadingAllRecordSintomeMemory.2)the Make:Model Model Moged-and-Mogration'ArtisanCommandSancancMommandSimplififieScreatingModeltigation.3)

Laravel迁移解释了:创建,修改和管理您的数据库Laravel迁移解释了:创建,修改和管理您的数据库May 12, 2025 am 12:11 AM

laravelmigrationssshouldbeusedbecausetheystreamlinedeplupment,nesurecresistencyAcrossenviments和simplifyCollaborationAndDeployment.1)shemallogragrammatonofdatabaseschemachanges,ReeducingErrors.2)MigrigationScanBeverCanbeverSionConconconconcontrollin.2)

Laravel迁移:值得使用吗?Laravel迁移:值得使用吗?May 12, 2025 am 12:10 AM

是的。

Laravel:软删除了性能问题Laravel:软删除了性能问题May 12, 2025 am 12:04 AM

SoftDeletesinLaravelimpactperformancebycomplicatingqueriesandincreasingstorageneeds.Tomitigatetheseissues:1)Indexthedeleted_atcolumntospeedupqueries,2)Useeagerloadingtoreducequerycount,and3)Regularlycleanupsoft-deletedrecordstomaintaindatabaseefficie

Laravel迁移对什么有益?用例和福利Laravel迁移对什么有益?用例和福利May 11, 2025 am 12:14 AM

Laravelmigrationsarebeneficialforversioncontrol,collaboration,andpromotinggooddevelopmentpractices.1)Theyallowtrackingandrollingbackdatabasechanges.2)Migrationsensureteammembers'schemasstaysynchronized.3)Theyencouragethoughtfuldatabasedesignandeasyre

如何在Laravel中使用软删除:保护您的数据如何在Laravel中使用软删除:保护您的数据May 11, 2025 am 12:14 AM

Laravel的软删除功能通过标记记录而非实际删除来保护数据。1)在模型中添加SoftDeletestrait和deleted_at字段。2)使用delete()方法标记删除,使用restore()方法恢复。3)查询时使用withTrashed()或onlyTrashed()包含软删除记录。4)定期清理超过一定时间的软删除记录以优化性能。

Laravel迁移是什么,您如何使用它们?Laravel迁移是什么,您如何使用它们?May 11, 2025 am 12:13 AM

laravelmigrationSareversionControlfordatabaseschemas,允许Roducibleandreversiblechanges.tousethem:1)creatighatsanmake:迁移',2)定义chemachangesinthe'up()

Laravel迁移:回滚行不通,发生了什么事?Laravel迁移:回滚行不通,发生了什么事?May 11, 2025 am 12:10 AM

Laravelmigrationsmayfailtorollbackduetodataintegrityissues,foreignkeyconstraints,orirreversibleactions.1)Dataintegrityissuescanoccurifamigrationaddsdatathatcan'tbeundone,likeacolumnwithadefaultvalue.2)Foreignkeyconstraintscanpreventrollbacksifrelatio

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热门文章

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具