1. 程式人生 > >laravel 實現Form 表單場景驗證

laravel 實現Form 表單場景驗證

前言:

laravel本身沒有像TP5那樣的form表單的場景驗證,這裡是我自己根據理解自己封裝的實現場景驗證。

廢話不多說了,上程式碼:

一、建立一個類 Validate 類,因為他是公共使用的沒有建在控制器下面:

這裡寫圖片描述

首先要繼承laravel 自帶的驗證類 use Illuminate\Support\Facades\Validator;

<?php
namespace  App\Validate;

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules;

class Validate
extends Validator {
/*** * 驗證欄位屬性 * * @param $all * @param $rules * @param bool $message * @return array|bool|string */ protected $input; /** * 重寫驗證場景 * @param $inputs * @param $scene * @return bool|string */ public function check
($inputs,$scene){
$input = $this->getInput($inputs,$scene); $rules = $this->getRules($scene); $messages = $this->getMessage($rules); $validator = Validator::make($input, $rules,$messages); //返回錯誤資訊 if ($validator->fails()) { return
$validator->errors()->first(); //返回錯誤資訊 } return false; } //獲取驗證資料 public function getInput($inputs,$scene) { foreach ($this->scene[$scene] as $key=>$v){ if (array_key_exists($v, $inputs)){ $input[$v] = $inputs[$v]; } } return $input; } /** * 獲取驗證規則 * @param $scene * @return mixed */ public function getRules($scene) { if ($this->scene[$scene]){ foreach ($this->scene[$scene] as $field){ if (array_key_exists($field, $this->rule)){ $rules[$field] = $this->rule[$field]; } } } return $rules; } /*** * 返回驗證message * @return array */ public function getMessage($rules){ foreach ($rules as $key=>$v){ $arr = explode('|',$v); foreach($arr as $k=>$val){ if (strpos($val,':')){ unset($arr[$k]); $arr[] = substr($val,0,strpos($val, ':')); } } foreach($arr as $value){ if (array_key_exists($key.'.'.$value, $this->message)){ $message[$key.'.'.$value] = $this->message[$key.'.'.$value]; } } } return $message; } //所有的驗證都可以寫在這個數組裡面 protected $rule = [ 'name'=>'required|unique:gems_activities|max:255', 'time'=>'required', 'duration'=>'required', 'location'=>'required', ]; //所有的驗證資訊提示都可以寫在這個數組裡面 protected $message = [ 'name.required' => '活動名稱不能為空', 'name.unique' => '活動名稱已經存在', 'time.max' => '活動名稱不能超過255個字元', 'time.required' => '活動時間不能為空', 'duration.required' => '活動週期不能為空', ]; protected $scene = [ 'addAct' => ['name','time','duration','location'], 'edit' => ['email'], ]; }

二、使用方法在你的控制器裡面先引入你的自定義的類 use App\Validate\Validate;

public function __construct(){
        $this->validate = new  Validate();
}

三、在你接收form表單資料的方法裡面實現:

  public function addCustomActivities(Request $reequest){

        if ($err = $this->validate->check($reequest->all(),'addAct'))
        throw new BaseException($err,0); //將異常丟擲
...
...
...
//編寫驗證之後的邏輯程式碼
    }

好了,就這麼些啦,各位小夥伴們有什麼更好的方法,希望多多交流分享一下…