Laravel --Validate (表單驗(yàn)證) 使用實(shí)例

前言 : Laravel 提供了多種方法來驗(yàn)證應(yīng)用輸入數(shù)據(jù)。默認(rèn)情況下,Laravel 的控制器基類使用ValidatesRequests trait,該trait提供了便利的方法通過各種功能強(qiáng)大的驗(yàn)證規(guī)則來驗(yàn)證輸入的 HTTP 請求。
要掌握 Laravel 強(qiáng)大的驗(yàn)證特性,讓我們先看一個(gè)完整的驗(yàn)證表單并返回錯(cuò)誤信息給用戶的例子。

在這之前如果您是首次接觸 Laravel 而且并不知道路由如何跳轉(zhuǎn)到指定的控制器 可以查看博主的Restfulapi或者Laravel官網(wǎng)對路由的介紹,在這里就不做介紹了。

一、使用方法

1.視圖中的表單

上半部分的 div 包含的內(nèi)容是當(dāng)表單出現(xiàn)錯(cuò)誤時(shí) 模版輸出錯(cuò)誤原因的地方(css樣式laravel已經(jīng)幫您配置好了 在public/bootstrap/css/bootstrap.min.css中寫好了樣式)

<div class="errors">  
    @if(count($errors)>0)
        <div class="box-body">
            <div class="alert alert-danger alert-dismissible">
                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                <h4><i class="icon fa fa-ban"></i>錯(cuò)誤:</h4>

                @foreach($errors->all() as $error)
                    {{$error}}
                @endforeach
            </div>

        </div>
    @endif
</div>

下面是一個(gè)簡單的表單提交(由于是展示案例 沒有寫樣式)

<form action="/test" method="post">
<input type="hidden" name="_token" value="{{ csrf_token() }}">

<label> 推薦碼:</label>  <input type="text" name="code">

<label>人員名稱:</label>  <input type="text" name="name">

<label>所屬單位:</label>  <input type="text" name="team">

<label>年  齡:</label>  <input type="number" name="age">

<label>畢業(yè)院校:</label>  <input type="text" name="school">

<label>產(chǎn)品案例網(wǎng)址:</label>  <input type="url" name="url">

<button type="submit" class="btn btn-block btn-social">添加數(shù)據(jù)</button>

</form>

2.控制器中驗(yàn)證數(shù)據(jù)

  • 表單的發(fā)送post請求,到test路由中 發(fā)送了_token, code, name, team, age, school, url 7個(gè)數(shù)據(jù);

  • 如果我的路由是以Restfulapi的寫法,它會(huì)根據(jù)我的提交方式自己找到控制器中對應(yīng)的store方法:

Route::resource('test', 'TestController');  

完整的控制器驗(yàn)證方法如下(Validate驗(yàn)證方式)

下面做一些簡單的驗(yàn)證(具體各個(gè)驗(yàn)證的方法底部列出詳情)

public function store(Request $request)  
{

        //
        $data = \Input::all();
        // 數(shù)據(jù)驗(yàn)證
        $this->validate($request, [
            'code' => 'required|digits:32', //必填 必須32位
            'name' => 'required|min:2|max:16',  //必填 最小2位 最大16位
            'team' => 'required|string', //必填 字符串
            'age' => 'required|numeric', //必填 數(shù)值
            'school' => 'required|max:255', //必填 最大255位
            'url' => 'required|url'  //必填 必須是網(wǎng)址
        ]);


        // 以上是表單驗(yàn)證 沒有驗(yàn)證成功是不會(huì)走下面的邏輯程序的 而且頁面上會(huì)響應(yīng)出拋出的異常信息
        ....
        ....
        ....

}

如圖:

表單

完整的控制器驗(yàn)證方法如下(Validator驗(yàn)證方式)

// 規(guī)則
$rules = array(
          'code' => 'required|digits:32', //必填 必須32位
          'name' => 'required|min:2|max:16',  //必填 最小2位 最大16位
          'team' => 'required|string', //必填 字符串
          'age' => 'required|numeric', //必填 數(shù)值
          'school' => 'required|max:255', //必填 最大255位
          'url' => 'required|url'  //必填 必須是網(wǎng)址
      );
// 驗(yàn)證器
$validator = \Validator::make($data,$rules);
// 進(jìn)行驗(yàn)證
if($validator->passes()){
      // 驗(yàn)證成功后的業(yè)務(wù)邏輯
      ...
      ...

      }else{
     // 失敗后 返回提交頁的頁面并拋出錯(cuò)誤
      return back()->withErrors('在這里自定義錯(cuò)誤原因!');
      }

Ps : 如果是使用 Validate方式驗(yàn)證,是哪個(gè)字段出現(xiàn)問題,就拋該字段的異常 默認(rèn)lang是只有英語的,所以如果為了客戶體驗(yàn),還需要安裝一個(gè)中文語言包,安裝包地址 中文語言包地址

備注:表單驗(yàn)證一般稱為服務(wù)器驗(yàn)證,服務(wù)器驗(yàn)證前,應(yīng)該做客戶體驗(yàn)更好的前端表單驗(yàn)證

驗(yàn)證規(guī)則大全

accepted

  • 在驗(yàn)證中該字段的值必須是yes、on、1或true,這在“同意服務(wù)協(xié)議”時(shí)很有用。

active_url

  • 該字段必須是一個(gè)基于PHP函數(shù)checkdnsrr 的有效URL

after:date

  • 該字段必須是給定日期后的一個(gè)值,日期將會(huì)通過PHP函數(shù)strtotime傳遞:

    <code>'start_date' => 'required|date|after:tomorrow' </code>

  • 你可以指定另外一個(gè)比較字段而不是使用strtotime驗(yàn)證傳遞的日期字符串:

<code>'finish_date' => 'required|date|after:start_date' </code>

alpha

  • 該字段必須是字母

alpha_dash

  • 該字段可以包含字母和數(shù)字,以及破折號和下劃線

alpha_num

  • 該字段必須是字母或數(shù)字

array

  • 該字段必須是PHP數(shù)組

before:date

  • 驗(yàn)證字段必須是指定日期之前的一個(gè)數(shù)值,該日期將會(huì)傳遞給PHP strtotime函數(shù)。

between:min,max

  • 驗(yàn)證字段尺寸在給定的最小值和最大值之間,字符串、數(shù)值和文件都可以使用該規(guī)則

boolean

  • 驗(yàn)證字段必須可以被轉(zhuǎn)化為boolean,接收true, false, 1,0, "1", 和 "0"等輸入。

confirmed

  • 驗(yàn)證字段必須有一個(gè)匹配字段fooconfirmation,例如,如果驗(yàn)證字段是password,必須輸入一個(gè)與之匹配的passwordconfirmation字段

date

  • 驗(yàn)證字段必須是一個(gè)基于PHP strtotime函數(shù)的有效日期

date_format:format

  • 驗(yàn)證字段必須匹配指定格式,該格式將使用PHP函數(shù)dateparsefromformat進(jìn)行驗(yàn)證。你應(yīng)該在驗(yàn)證字段時(shí)使用date或dateformat

different:field

  • 驗(yàn)證字段必須是一個(gè)和指定字段不同的值

digits:value

  • 驗(yàn)證字段必須是數(shù)字且長度為value指定的值

digits_between:min,max

  • 驗(yàn)證字段數(shù)值長度必須介于最小值和最大值之間

dimensions

  • 驗(yàn)證的圖片尺寸必須滿足該規(guī)定參數(shù)指定的約束條件:

    <code>'avatar' => 'dimensions:min_width=100,min_height=200' </code>

  • 有效的約束條件包括:min_width, max_width, min_height, max_height, width, height, ratio

  • ratio約束應(yīng)該是寬度/高度,這可以通過表達(dá)式3/2或浮點(diǎn)數(shù)1.5來表示:

    <code>'avatar' => 'dimensions:ratio=3/2' </code>

**distinct **

  • 處理數(shù)組時(shí),驗(yàn)證字段不能包含重復(fù)值:
'foo.*.id' => 'distinct'  

email

  • 驗(yàn)證字段必須是格式化的電子郵件地址 exists:table,column

  • 驗(yàn)證字段必須存在于指定數(shù)據(jù)表

基本使用:

'state' => 'exists:states'  
指定自定義列名:

'state' => 'exists:states,abbreviation'  
還可以添加更多查詢條件到where查詢子句:

'email' => 'exists:staff,email,account_id,1'  
這些條件還可以包含!:

'email' => 'exists:staff,email,role,!admin'  
還可以傳遞NULL或NOT NULL到where子句:

'email' => 'exists:staff,email,deleted_at,NULL'  
'email' => 'exists:staff,email,deleted_at,NOT_NULL'  
有時(shí),你可能需要為exists查詢指定要使用的數(shù)據(jù)庫連接,這可以通過在表名前通過.前置數(shù)據(jù)庫連接來實(shí)現(xiàn):

'email' => 'exists:connection.staff,email'  

file

  • 該驗(yàn)證字段必須是上傳成功的文件

filled

  • 該驗(yàn)證字段如果存在則不能為空

image

  • 驗(yàn)證文件必須是圖片(jpeg、png、bmp、gif或者svg) in:foo,bar…

  • 驗(yàn)證字段值必須在給定的列表中

in_array:另一個(gè)字段

驗(yàn)證字段必須在另一個(gè)字段中存在

integer

驗(yàn)證字段必須是整型

ip

驗(yàn)證字段必須是IP地址

JSON

驗(yàn)證字段必須是有效的JSON字符串

max:value

驗(yàn)證字段必須小于等于最大值,和字符串、數(shù)值、文件字段的size規(guī)則一起使用 mimetypes:text/plain…

驗(yàn)證文件必須匹配給定的MIME文件類型之一:

'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime' 

為了判斷上傳文件的MIME類型,框架將會(huì)讀取文件內(nèi)容來猜測MIME類型,這可能會(huì)和客戶端MIME類型不同。 mimes:foo,bar,…

驗(yàn)證文件的MIMIE類型必須是該規(guī)則列出的擴(kuò)展類型中的一個(gè)

MIMIE規(guī)則的基本使用:

'photo' => 'mimes:jpeg,bmp,png'  

盡管你只需要指定擴(kuò)展,該規(guī)則實(shí)際上驗(yàn)證的是通過讀取文件內(nèi)容獲取到的文件MIME類型。 完整的MIME類型列表及其相應(yīng)的擴(kuò)展可以在這里找到:http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types

min:value

  • 驗(yàn)證字段的最小值,和字符串、數(shù)值、文件字段的size規(guī)則一起使用

nullable

  • 驗(yàn)證字段必須為null,這在驗(yàn)證一些可以為null的原生數(shù)據(jù)如整型或字符串時(shí)很有用。

not_in:foo,bar,…

  • 驗(yàn)證字段值不在給定列表中

numeric

  • 驗(yàn)證字段必須是數(shù)值

present

  • 驗(yàn)證字段必須出現(xiàn)在輸入數(shù)據(jù)中但不能為空。

regex:pattern

  • 驗(yàn)證字段必須匹配給定正則表達(dá)式

注:使用regex模式時(shí),規(guī)則必須放在數(shù)組中,而不能使用管道分隔符,尤其是正則表達(dá)式中使用管道符號時(shí)。

required

  • 輸入字段值不能為空,以下情況字段值都為空:

  • 值為null

  • 值是空字符串

  • 值是空數(shù)組或者空的Coutable對象

  • 值是上傳文件但路徑為空


required_if:anotherfield,value,…

驗(yàn)證字段在另一個(gè)字段等于指定值value時(shí)是必須的

required_unless:anotherfield,value,…

除了 anotherfield 字段等于value,驗(yàn)證字段不能空

required_with:foo,bar,…

驗(yàn)證字段只有在任一其它指定字段存在的話才是必須的

required_with_all:foo,bar,…

驗(yàn)證字段只有在所有指定字段存在的情況下才是必須的

required_without:foo,bar,…

驗(yàn)證字段只有當(dāng)任一指定字段不存在的情況下才是必須的

required_without_all:foo,bar,…

驗(yàn)證字段只有當(dāng)所有指定字段不存在的情況下才是必須的

same:field

給定字段和驗(yàn)證字段必須匹配

size:value

驗(yàn)證字段必須有和給定值value相匹配的尺寸,對字符串而言,value是相應(yīng)的字符數(shù)目;對數(shù)值而言,value是給定整型值;對文件而言,value是相應(yīng)的文件字節(jié)數(shù)

string

驗(yàn)證字段必須是字符串

timezone

驗(yàn)證字符必須是基于PHP函數(shù)timezoneidentifierslist的有效時(shí)區(qū)標(biāo)識

unique:table,column,except,idColumn

驗(yàn)證字段在給定數(shù)據(jù)表上必須是唯一的,如果不指定column選項(xiàng),字段名將作為默認(rèn)column。

指定自定義列名:

'email' => 'unique:users,email_address'  
自定義數(shù)據(jù)庫連接

有時(shí)候,你可能需要自定義驗(yàn)證器生成的數(shù)據(jù)庫連接,正如上面所看到的,設(shè)置unique:users作為驗(yàn)證規(guī)則將會(huì)使用默認(rèn)數(shù)據(jù)庫連接來查詢數(shù)據(jù)庫。要覆蓋默認(rèn)連接,在數(shù)據(jù)表名后使用“.”指定連接:

'email' => 'unique:connection.users,email_address'  
強(qiáng)制一個(gè)唯一規(guī)則來忽略給定ID:

有時(shí)候,你可能希望在唯一檢查時(shí)忽略給定ID,例如,考慮一個(gè)包含用戶名、郵箱地址和位置的”更新屬性“界面,當(dāng)然,你將會(huì)驗(yàn)證郵箱地址是唯一的,然而,如果用戶只改變用戶名字段而并沒有改變郵箱字段,你不想要因?yàn)橛脩粢呀?jīng)擁有該郵箱地址而拋出驗(yàn)證錯(cuò)誤,你只想要在用戶提供的郵箱已經(jīng)被別人使用的情況下才拋出驗(yàn)證錯(cuò)誤,要告訴唯一規(guī)則忽略用戶ID,可以傳遞ID作為第三個(gè)參數(shù):

'email' => 'unique:users,email_address,'.$user->id  
如果你的數(shù)據(jù)表使用主鍵字段不是id,可以指定第四個(gè)輸入?yún)?shù):

'email' => 'unique:users,email_address,'.$user->id.',user_id'  
添加額外的where子句:

還可以指定更多條件給where子句:

'email' => 'unique:users,email_address,NULL,id,account_id,1'  
在上述規(guī)則中,只有account_id為1記錄才會(huì)進(jìn)行唯一性檢查。

url

驗(yàn)證字段必須是基于PHP函數(shù)filter_var過濾的的有效URL
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,720評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內(nèi)容

  • 1、簡介 Laravel 提供了多種方法來驗(yàn)證應(yīng)用輸入數(shù)據(jù)。默認(rèn)情況下,Laravel 的控制器基類使用Valid...
    伊Summer閱讀 1,534評論 0 3
  • 驗(yàn)證 簡介 Laravel 對驗(yàn)證應(yīng)用的輸入數(shù)據(jù)提供了多中途徑的實(shí)現(xiàn)。默認(rèn)的,Laravel 的基礎(chǔ)控制器類使用了...
    Dearmadman閱讀 10,218評論 5 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,775評論 18 139
  • 表單基礎(chǔ)知識 在HTML中,表單是由 元素來表示的,而在JS中,表單對應(yīng)的則是HTMLFormElement類型。...
    oWSQo閱讀 914評論 0 1
  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,617評論 0 121