您现在的位置是:自如初>LaravelLaravel

Laravel表单请求验证忽略某些字段验证

小白 2021-01-09 20:05:49 Laravel 184人已围观

简介Laravel表单请求验证忽略某些字段验证。添加和修改时,对于数据的验证有时候是不同的,如添加时要对邮箱进行唯一性验证,那么编辑时就要忽略该邮箱的唯一验证,不然将始终提示邮箱已存在。对此,官方文档仅仅只是提供了粗糙的案例,用起来并不容易。本篇文章将提供2种方法(实际上就是一种方法的延伸)。

添加和修改时,对于数据的验证有时候是不同的,如添加时要对邮箱进行唯一性验证,那么编辑时就要忽略该邮箱的唯一验证,不然将始终提示邮箱已存在。对此,官方文档仅仅只是提供了粗糙的案例,用起来并不容易。本篇文章将提供2种方法(实际上就是一种方法的延伸)。


问题

问题具体描述,如有2个页面,add.blade.php与edit.blade.php。

add.blade.php

<input type="text" name="email" class="layui-input" lay-verify="email">
<input type="text" name="username" class="layui-input" lay-verify="required">

edit.blade.php

<input type="text" name="email" vlaue="{{$u->email}}" class="layui-input" lay-verify="email">
<input type="text" name="username" value="{{$u->username}}" class="layui-input" lay-verify="required">

2个页面都有email字段,add时对email字段做了唯一性验证,编辑时就不对该email进行唯一验证,但是若更改了email的值,唯一性验证还是需要的。另外,要是edit页面中,对username不进行验证又该怎么办?


对于上述情况,有两种解决,

1)写2个表单请求验证,如UsAddRequest.phpUsUpdateRequest.php分开独立验证。缺点是多写文件,代码重复,优点是清晰;

2)手动实现一个场景验证。缺点就是代码多,优点是文件少。

本文将记录2)种方法实现。实际上,两种方法是一致的,只是将1)种方法的逻辑融合到2)种,然后分离出场景验证。

Laravel过滤表单验证及手动场景验证

以User模块为假设,路由、控制器、模板页面请自行创建。对于添加就不多说了,重点在于编辑界面。

第一步:定义路由

# 处理更新
Route::put('/update/{id}','UserController@update');

第二步:控制器方法、请求验证、界面自行创建

第三步:过滤表单请求验证

说明:添加与更新都使用UserReqest.php验证。

3.1、UserController控制器方法

// 添加
public function store(UserRequest $request){}
// 更新
public function update(UserRequest $request){}

3.2、UserRequest.php验证实现

<?php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
class UserRequest extends FormRequest
{
   // 将验证规则分离为属性
   protected $msg = [
       'username.required'     =>  '用户名必须填写',
       'email.unique'          =>  '邮箱已存在'
   ];

   public function authorize()
   {
       return true;
   }

// 验证规则
   public function rules()
   {
       return $this->scene();
   }

   // 错误信息
   public function messages()
   {
       return $this->msg;
   }

   // 验证场景
   protected function scene()
   {
       // 接收当前路由参数
       $id = $this->route('id');
       // 请求方法
       $requestMethod = $this->method();
       // 判断是添加还是更新
       if ($requestMethod == 'POST') {
           // 添加操作
           return [
               'username'  =>  'required',
               'email'     =>  'required|email|unique:users'
           ];
       } else if ($requestMethod == 'PUT') {
           // 删除不需要的错误信息
           unset($this->msg['password.required']);
           unset($this->msg['password.min']);
           // 更新操作
           return [
               'email'     =>  'required|email|unique:users,email,' . $id
           ];
       }
   }
}

解释:

自定义了一个scene验证场景;

scene方法体中,根据请求方法的不同来区分是添加还是更新操作;

请求类型为POST,则为添加操作,那么验证所有,请求类型为PUT则为更新操作,那么只验证email并过滤自身(不验证)。


当更新时需要注意:

$id = $this->route('id');获取的是当前路由参数Route::put('/update/{id}','UserController@update');,

验证规则:'email'     =>  'required|email|unique:users,email,' . $id忽略自身的验证,需要注意:可以看到有2个email,第一个email是验证邮箱格式,第二个email是过滤当前验证,'email,'.$id必须严格按照这种格式。

这样一个简单的自定义场景验证规则就完成了。


我是小白,期待和优秀的你一起同行!


  小白

  2021年01月09日

很赞哦!(3)

文章评论

登录 注册

自如初--时间轴

站名:自如初

独白:向前走!向前走!

邮箱:457969743@qq.com

站点信息