解析如何进行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场景对应的验证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文件,写入如下代码:

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进行子查询