laravel 實現Form 表單場景驗證
阿新 • • 發佈:2019-01-01
前言:
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); //將異常丟擲
...
...
...
//編寫驗證之後的邏輯程式碼
}
好了,就這麼些啦,各位小夥伴們有什麼更好的方法,希望多多交流分享一下…