為你的 Laravel 驗(yàn)證器加上多驗(yàn)證場(chǎng)景的實(shí)現(xiàn)
前言
在我們使用 laravel 框架的驗(yàn)證器,有的時(shí)候需要對(duì)表單等進(jìn)行數(shù)據(jù)驗(yàn)證,當(dāng)然 laravel 也為我們提供了
Illuminate\Http\Request 對(duì)象提供的 validate 方法 以及 FormRequest 和 Validator。
FormRequest 通過(guò)新建文件將我們的驗(yàn)證部分單獨(dú)分開(kāi),來(lái)避免控制器臃腫。如果驗(yàn)證失敗,就會(huì)生成一個(gè)讓用戶返回到先前的位置的重定向響應(yīng)。這些錯(cuò)誤也會(huì)被閃存到 Session 中,以便這些錯(cuò)誤都可以在頁(yè)面中顯示出來(lái)。如果傳入的請(qǐng)求是 AJAX,會(huì)向用戶返回具有 422 狀態(tài)代碼和驗(yàn)證錯(cuò)誤信息的 JSON 數(shù)據(jù)的 HTTP 響應(yīng)。如果是接口請(qǐng)求或 ajax, 那么我們可能還需要將返回的 json 數(shù)據(jù)修改成我們想要的格式。
當(dāng)我們實(shí)際開(kāi)發(fā)中,可能一個(gè)模塊需要有多個(gè)驗(yàn)證場(chǎng)景,如果為每一個(gè)驗(yàn)證場(chǎng)景都新建一個(gè) FormRequest 不就太過(guò)繁瑣了。
那么給 laravel 加上一個(gè)驗(yàn)證場(chǎng)景通過(guò)一個(gè)驗(yàn)證類一個(gè)模塊或多個(gè)模塊來(lái)適應(yīng)不同的場(chǎng)景不就方便很多了。
開(kāi)始
首先 我們封裝了一個(gè)基類 BaseValidate.php 并將其放在 app\Validate 下,當(dāng)然你也可以放在其他地方,只要修改好命名空間就好。
<?php namespace App\Validate; use Illuminate\Support\Facades\Validator; /** * 擴(kuò)展驗(yàn)證器 */ class BaseValidate { /** * 當(dāng)前驗(yàn)證規(guī)則 * @var array */ protected $rule = []; /** * 驗(yàn)證提示信息 * @var array */ protected $message = []; /** * 驗(yàn)證場(chǎng)景定義 * @var array */ protected $scene = []; /** * 設(shè)置當(dāng)前驗(yàn)證場(chǎng)景 * @var array */ protected $currentScene = null; /** * 驗(yàn)證失敗錯(cuò)誤信息 * @var array */ protected $error = []; /** * 場(chǎng)景需要驗(yàn)證的規(guī)則 * @var array */ protected $only = []; /** * 設(shè)置驗(yàn)證場(chǎng)景 * @access public * @param string $name 場(chǎng)景名 * @return $this */ public function scene($name) { // 設(shè)置當(dāng)前場(chǎng)景 $this->currentScene = $name; return $this; } /** * 數(shù)據(jù)驗(yàn)證 * @access public * @param array $data 數(shù)據(jù) * @param mixed $rules 驗(yàn)證規(guī)則 * @param array $message 自定義驗(yàn)證信息 * @param string $scene 驗(yàn)證場(chǎng)景 * @return bool */ public function check($data, $rules = [], $message = [],$scene = '') { $this->error =[]; if (empty($rules)) { //讀取驗(yàn)證規(guī)則 $rules = $this->rule; } if (empty($message)) { $message = $this->message; } //讀取場(chǎng)景 if (!$this->getScene($scene)) { return false; } //如果場(chǎng)景需要驗(yàn)證的規(guī)則不為空 if (!empty($this->only)) { $new_rules = []; foreach ($this->only as $key => $value) { if (array_key_exists($value,$rules)) { $new_rules[$value] = $rules[$value]; } } $rules = $new_rules; } // var_dump($rules);die; $validator = Validator::make($data,$rules,$message); //驗(yàn)證失敗 if ($validator->fails()) { $this->error = $validator->errors()->first(); return false; } return !empty($this->error) ? false : true; } /** * 獲取數(shù)據(jù)驗(yàn)證的場(chǎng)景 * @access protected * @param string $scene 驗(yàn)證場(chǎng)景 * @return void */ protected function getScene($scene = '') { if (empty($scene)) { // 讀取指定場(chǎng)景 $scene = $this->currentScene; } $this->only = []; if (empty($scene)) { return true; } if (!isset($this->scene[$scene])) { //指定場(chǎng)景未找到寫入error $this->error = "scene:".$scene.'is not found'; return false; } // 如果設(shè)置了驗(yàn)證適用場(chǎng)景 $scene = $this->scene[$scene]; if (is_string($scene)) { $scene = explode(',', $scene); } //將場(chǎng)景需要驗(yàn)證的字段填充入only $this->only = $scene; return true; } // 獲取錯(cuò)誤信息 public function getError() { return $this->error; } }
使用
接下來(lái)我們來(lái)驗(yàn)證一個(gè)文章的提交信息,首先我們新建一個(gè)文章驗(yàn)證類 ArticleValidate.php 并填充一些內(nèi)容
<?php namespace App\Validate; use App\Validate\BaseValidate; /** * 文章驗(yàn)證器 */ class ArticleValidate extends BaseValidate { //驗(yàn)證規(guī)則 protected $rule =[ 'id'=>'required', 'title' => 'required|max:255', 'content' => 'required', ]; //自定義驗(yàn)證信息 protected $message = [ 'id.required'=>'缺少文章id', 'title.required'=>'請(qǐng)輸入title', 'title.max'=>'title長(zhǎng)度不能大于 255', 'content.required'=>'請(qǐng)輸入內(nèi)容', ]; //自定義場(chǎng)景 protected $scene = [ 'add'=>"title,content", 'edit'=> ['id','title','content'], ]; }
如上所示,在這個(gè)類中我們定義了驗(yàn)證規(guī)則 rule,自定義驗(yàn)證信息 message,以及驗(yàn)證場(chǎng)景 scene
非場(chǎng)景驗(yàn)證
我們只需要定義好規(guī)則
public function update(){ $ArticleValidate = new ArticleValidate; $request_data = [ 'id'=>'1', 'title'=>'我是文章的標(biāo)題', 'content'=>'我是文章的內(nèi)容', ]; if (!$ArticleValidate->check($request_data)) { var_dump($ArticleValidate->getError()); } }
check 方法中總共有四個(gè)參數(shù),第一個(gè)要驗(yàn)證的數(shù)據(jù),第二個(gè)驗(yàn)證規(guī)則,第三個(gè)自定義錯(cuò)誤信息,第四個(gè)驗(yàn)證場(chǎng)景,其中 2,3,4 非必傳。
如果驗(yàn)證未通過(guò)我們調(diào)用 getError() 方法來(lái)輸出錯(cuò)誤信息,getError()暫不支持返回所有驗(yàn)證錯(cuò)誤信息 。
場(chǎng)景驗(yàn)證
我們需要提前在驗(yàn)證類中定義好驗(yàn)證場(chǎng)景
如下,支持使用字符串或數(shù)組,使用字符串時(shí),要驗(yàn)證的字段需用 , 隔開(kāi)
//自定義場(chǎng)景 protected $scene = [ 'add'=>"title,content", 'edit'=> ['id','title','content'], ];
然后在我們的控制器進(jìn)行數(shù)據(jù)驗(yàn)證
public function add(){ $ArticleValidate = new ArticleValidate; $request_data = [ 'title'=>'我是文章的標(biāo)題', 'content'=>'我是文章的內(nèi)容', ]; if (!$ArticleValidate->scene('add')->check($request_data)) { var_dump($ArticleValidate->getError()); } }
控制器內(nèi)驗(yàn)證
當(dāng)然我們也允許你不創(chuàng)建驗(yàn)證類來(lái)驗(yàn)證數(shù)據(jù),
public function add(){ $Validate = new BaseValidate; $request_data = [ 'title'=>'我是文章的標(biāo)題', 'content'=>'我是文章的內(nèi)容', ]; $rule =[ 'id'=>'required', 'title' => 'required|max:255', 'content' => 'required', ]; //自定義驗(yàn)證信息 $message = [ 'id.required'=>'缺少文章id', 'title.required'=>'請(qǐng)輸入title', 'title.max'=>'title長(zhǎng)度不能大于 255', 'content.required'=>'請(qǐng)輸入內(nèi)容', ]; if (!$Validate->check($request_data,$rule,$message)) { var_dump($Validate->getError()); } }
通過(guò)驗(yàn)證場(chǎng)景,既減少了控制器代碼的臃腫,又減少了 FormRequest 文件過(guò)多,還可以自定義 json 數(shù)據(jù)是不是方便多了呢,
參考文檔
laravel 表單驗(yàn)證 :表單驗(yàn)證《Laravel 5.5 中文文檔》
thinkphp 驗(yàn)證場(chǎng)景 :https://www.kancloud.cn/manual/thinkphp5_1/354104
到此這篇關(guān)于為你的 Laravel 驗(yàn)證器加上多驗(yàn)證場(chǎng)景的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Laravel 驗(yàn)證器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
本文為楊攀遙原創(chuàng)文章,如若轉(zhuǎn)載,無(wú)需和我聯(lián)系,但請(qǐng)注明出處 [楊攀遙的博客]:https://www.yangpanyao.com/archives/120.html
- Laravel框架表單驗(yàn)證詳解
- Laravel 5框架學(xué)習(xí)之表單驗(yàn)證
- 使用 laravel sms 構(gòu)建短信驗(yàn)證碼發(fā)送校驗(yàn)功能
- Laravel中unique和exists驗(yàn)證規(guī)則的優(yōu)化詳解
- Laravel框架用戶登陸身份驗(yàn)證實(shí)現(xiàn)方法詳解
- Laravel 5.5 的自定義驗(yàn)證對(duì)象/類示例代碼詳解
- laravel中短信發(fā)送驗(yàn)證碼的實(shí)現(xiàn)方法
- laravel5.4生成驗(yàn)證碼的實(shí)例講解
- laravel5.4生成驗(yàn)證碼的代碼
相關(guān)文章
ThinkPHP采用原生query實(shí)現(xiàn)關(guān)聯(lián)查詢left join實(shí)例
這篇文章主要介紹了ThinkPHP采用原生query實(shí)現(xiàn)關(guān)聯(lián)查詢left join的方法,實(shí)例展示了ThinkPHP中query方法的使用技巧,需要的朋友可以參考下2014-12-12laravel-admin表單提交隱藏一些數(shù)據(jù),回調(diào)時(shí)獲取數(shù)據(jù)的方法
今天小編就為大家分享一篇laravel-admin表單提交隱藏一些數(shù)據(jù),回調(diào)時(shí)獲取數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10PHP實(shí)現(xiàn)留言板功能的詳細(xì)代碼
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)留言板功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03WordPress免插件實(shí)現(xiàn)面包屑導(dǎo)航的示例代碼
這篇文章主要介紹了WordPress免插件實(shí)現(xiàn)面包屑導(dǎo)航,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08PHP中使用gettext解決國(guó)際化問(wèn)題的例子(i18n)
這篇文章主要介紹了PHP中使用gettext解決國(guó)際化問(wèn)題的例子,即實(shí)現(xiàn)i18n,需要的朋友可以參考下2014-06-06PHP中static關(guān)鍵字以及與self關(guān)鍵字的區(qū)別
這篇文章主要介紹了PHP中static關(guān)鍵字以及與self關(guān)鍵字的區(qū)別,本文講解了static關(guān)鍵字的定義、遲綁定(Late Static Bindings)、以及與self關(guān)鍵字的區(qū)別等內(nèi)容,需要的朋友可以參考下2015-07-07微信營(yíng)銷平臺(tái)系統(tǒng)–刮刮樂(lè)的開(kāi)發(fā)
最近一直在做微信相關(guān)的開(kāi)發(fā)工作,刮刮樂(lè)是一個(gè)最常見(jiàn)的微信應(yīng)用了,網(wǎng)上也有很多的教程,本來(lái)是不想寫這篇博文的,但又怕網(wǎng)友被坑,我還是寫一下。2014-06-06