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。如果你有别的方法或者想法可以在评论中和我交流。

posted on 2018-06-01 19:37  泽一年  阅读(726)  评论(0编辑  收藏  举报

导航