Laravel 5.5 FormRequest 自定义表单请求验证类

Posted 泽一年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 5.5 FormRequest 自定义表单请求验证类相关的知识,希望对你有一定的参考价值。

1、把表单验证逻辑写在Controller中,这是最基础的方法,但是不好维护,如:

 1 namespace App\\Http\\Controllers\\Admin;
 2 
 3 use Illuminate\\Http\\Request;
 4 use App\\Http\\Controllers\\Controller;
 5 
 6 class MemberController extends Controller
 7 {
 8     // 登录模块
 9     public function login (Request $request){
10         if($request->isMethod(\'POST\')){
11             $this->validate($request,[
12                 \'username\' => \'required|max:10\',
13                 \'password\' => \'required|between:6,20\',
14                 ],[
15                 \'username.required\' => \'用户名必填\',
16                 \'password.required\' => \'密码必填\',
17                 ]);
18     
19         }
20         return view(\'admin.login\');
21     }
22 }

这样写的话,表单验证和业务逻辑挤在一起,我们的Controller中就会有太多的代码,而且重复的验证规则基本也是复制粘贴。

我们可以利用Form Request来封装表单验证代码,从而精简Controller中的代码逻辑,使其专注于业务。而独立出去的表单验证逻辑甚至可以复用到其它请求中。

 

2、首先我们打开dos命令,进入该项目根目录下,创建request验证类:

3、MemberRequest公用验证模块代码

<?php

namespace App\\Http\\Requests;

use Illuminate\\Foundation\\Http\\FormRequest;

class MemberUserRequest extends FormRequest
{
    // 公共部分
    public $rules=[
        \'username\' => \'required|max:10|unique:la_member\',
        \'password\' => \'required|between:6,20|confirmed\',

    ];

    //这里我只写了部分字段,可以定义全部字段
    protected $messages=[
        \'username.required\' => \'用户名必填\',
        \'username.max\' => \'用户名最多为10字符\',
        \'username.unique\' => \'用户名已存在\',
        \'email.required\' => \'邮箱必填\',
        \'email.email\' => \'邮箱格式错误11\',
        \'password.required\' => \'密码必填\',
        \'password.between\' => \'密码长度为6-20位字符\',
        \'password.confirmed\' => \'两次密码不一致\',
        \'code.required\' => \'验证码不能为空\',
        \'code.between\' => \'验证码输入错误\'
     ];


    public function authorize()  //这个方法可以用来控制访问权限,例如禁止未付费用户访问
    {
        return true; //默认是false,使用时改成true,
    }

    public function rules()
    {
        $rules=$this->rules;
        // \\Request::getPathInfo()方法获取命名路由,用来区分不同页面
        if(\\Request::getPathInfo()==\'/admin/reg_sub\'){ //路由为/admin/reg_sub的特有验证部分
            $rules[\'email\']=\'required|email\';
            $rules[\'code\']=\'required|between:4,4\';
        }
        return $rules;
    }

    public function messages(){  //返回自定义消息,不使用的话为默认提示
        return $this->messages;
    }

}

4、控制器代码

 3 namespace App\\Http\\Controllers\\Admin;
 4 
 5 use Illuminate\\Http\\Request;
 6 use App\\Http\\Controllers\\Controller;
 7 use Crypt;
 8 use DB;10 
11 
12 class MemberController extends Controller
13 {
14     // 登录模块
15     public function login (){
16         return view(\'admin.login\');
17     }
18     // 登录提交
19     public function login_sub (\\App\\Http\\Requests\\MemberRequest $request){  //引入验证控制器后它会自动验证,不需其他操作
20         $username = $request->input(\'username\');
21         $password = $request->input(\'password\');
22         $data=[
23             \'username\' => $username,
24             \'password\' => Crypt::encrypt($password),
25             \'login_time\' => time(),
26         ];
27 
28        //查询数据库验证登陆代码
29        
30     }
31 }

5、登陆视图模块

@extends(\'admin/public/pub\')
@section(\'content\')
<div id="myform">
    <center><h3>新用户</h3></center>
    <form method="post" action="{{url(\'admin/login_sub\')}}" id="">
        {{csrf_field()}}
        <fieldset>
            <legend>用户登陆</legend>
            <div>
                <label for="Name">用户名</label>
                <input type="text" name="username" value="{{old(\'username\')}}" class="input" id="Name" size="20" maxlength="30"/>
                <br>
            </div>
            <div>
                <label for="password">输入密码</label>
                <input type="password" name="password" value="{{old(\'password\')}}" class="input" id="password" size="18" maxlength="15"/>
            </div>
            <div>
            </div>
            <div class="enter">
                <input name="login" type="submit" class="buttom" value="登陆"/>
                <a href="{{url(\'admin/reg\')}}">注册</a>
            </div>
        </fieldset>
    </form>
    <br>
    @if(count($errors)>0)
        @foreach($errors->all() as $error)
            {{$error}}
        @endforeach
    @endif
</div>
@endsection

在视图中提示消息代码

1 @if(count($errors)>0)
2         @foreach($errors->all() as $error)
3             {{$error}}
4         @endforeach
5 @endif

也可以单行提示

{{$errors->first()}}

 

这里是我总结的一些经验,使得rules()能够可复用且只新增一个Request。如果你有别的方法或者想法可以在评论中和我交流。

以上是关于Laravel 5.5 FormRequest 自定义表单请求验证类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5.5 的 FormRequest 类中返回自定义响应?

自定义 Laravel FormRequest 自动验证方法

PHPUnit env中的Laravel自定义FormRequest

自定义laravel表单请求验证类(FormRequest共用一个rules())

单元测试 Laravel FormRequest

如何仅从 laravel FormRequest 中获取经过验证的数据?