1. 程式人生 > >Laravel 5.5 FormRequest 自定義表單請求驗證類

Laravel 5.5 FormRequest 自定義表單請求驗證類

根目錄 use his extends 數據 不一致 不能 登錄模塊 能夠

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 自定義表單請求驗證類