Laravel框架表單驗(yàn)證詳解
基礎(chǔ)驗(yàn)證例子
$validator = Validator::make(
array('name' => 'Dayle'),
array('name' => 'required|min:5')
);
傳遞給 make 函數(shù)的第一個(gè)參數(shù)是待驗(yàn)證的數(shù)據(jù),第二個(gè)參數(shù)是對(duì)該數(shù)據(jù)需要應(yīng)用的驗(yàn)證規(guī)則。
多個(gè)驗(yàn)證規(guī)則可以通過(guò) "|" 字符進(jìn)行隔開(kāi),或者作為數(shù)組的一個(gè)單獨(dú)的元素。
通過(guò)數(shù)組指定驗(yàn)證規(guī)則
$validator = Validator::make(
array('name' => 'Dayle'),
array('name' => array('required', 'min:5'))
);
一旦一個(gè) Validator 實(shí)例被創(chuàng)建,可以使用 fails (或者 passes)函數(shù)執(zhí)行這個(gè)驗(yàn)證。
if ($validator->fails())
{
// The given data did not pass validation
}
如果驗(yàn)證失敗,您可以從驗(yàn)證器中獲取錯(cuò)誤消息。
$messages = $validator->messages();
您也可以使用 failed 函數(shù)得到不帶錯(cuò)誤消息的沒(méi)有通過(guò)驗(yàn)證的規(guī)則的數(shù)組。
$failed = $validator->failed();
文件驗(yàn)證
Validator 類(lèi)提供了一些驗(yàn)證規(guī)則用于驗(yàn)證文件,比如 size、mimes等。在驗(yàn)證文件的時(shí)候,您可以和其他驗(yàn)證一樣傳遞給驗(yàn)證器。
附帶錯(cuò)誤消息
在一個(gè) Validator 實(shí)例上調(diào)用 messages 函數(shù)之后,將會(huì)得到一個(gè) MessageBag 實(shí)例,該實(shí)例擁有很多處理錯(cuò)誤消息的方便的函數(shù)。
獲取一個(gè)域的第一個(gè)錯(cuò)誤消息
echo $messages->first('email');
獲取一個(gè)域的全部錯(cuò)誤消息
foreach ($messages->get('email') as $message)
{
//
}
獲取全部域的全部錯(cuò)誤消息
foreach ($messages->all() as $message)
{
//
}
檢查一個(gè)域是否存在消息
if ($messages->has('email'))
{
//
}
以某種格式獲取一條錯(cuò)誤消息
echo $messages->first('email', '<p>:message</p>');
注意: 默認(rèn)情況下,消息將使用與 Bootstrap 兼容的語(yǔ)法進(jìn)行格式化。
以某種格式獲取所有錯(cuò)誤消息
foreach ($messages->all('<li>:message</li>') as $message)
{
//
}
錯(cuò)誤消息 & 視圖
一旦您執(zhí)行了驗(yàn)證,您需要一種簡(jiǎn)單的方法向視圖反饋錯(cuò)誤消息。這在 Lavavel 中能夠方便的處理。以下面的路由作為例子:
Route::get('register', function()
{
return View::make('user.register');
});
Route::post('register', function()
{
$rules = array(...);
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails())
{
return Redirect::to('register')->withErrors($validator);
}
});
注意當(dāng)驗(yàn)證失敗,我們使用 withErrors 函數(shù)把 Validator 實(shí)例傳遞給 Redirect。這個(gè)函數(shù)將刷新 Session 中保存的錯(cuò)誤消息,使得在下次請(qǐng)求中能夠可用。
然而,注意我們沒(méi)有必要明確的在 GET 路由中綁定錯(cuò)誤消息到路由。這是因?yàn)?Laravel 總會(huì)檢查 Session 中的錯(cuò)誤,并自動(dòng)綁定它們到視圖如果它們是可用的。所以,對(duì)于每個(gè)請(qǐng)求,一個(gè) $errors 變量在所有視圖中總是可用的,允許您方便的認(rèn)為 $errors 總是被定義并可以安全使用的。$errors 變量將是一個(gè) MessageBag 類(lèi)的實(shí)例。
所以,在跳轉(zhuǎn)之后,您可以在視圖中使用自動(dòng)綁定的 $errors 變量:
<?php echo $errors->first('email'); ?>
可用的驗(yàn)證規(guī)則
下面是一個(gè)所有可用的驗(yàn)證規(guī)則的列表以及它們的功能:
Accepted
Active URL
After (Date)
Alpha
Alpha Dash
Alpha Numeric
Before (Date)
Between
Confirmed
Date
Date Format
Different
Exists (Database)
Image (File)
In
Integer
IP Address
Max
MIME Types
Min
Not In
Numeric
Regular Expression
Required
Required If
Required With
Required Without
Same
Size
Unique (Database)
accepted
驗(yàn)證此規(guī)則的值必須是 yes、 on 或者是 1。這在驗(yàn)證是否同意"服務(wù)條款"的時(shí)候非常有用。
active_url
驗(yàn)證此規(guī)則的值必須是一個(gè)合法的 URL,根據(jù) PHP 函數(shù) checkdnsrr。
after:date
驗(yàn)證此規(guī)則的值必須在給定日期之后,日期將通過(guò) PHP 函數(shù) strtotime 傳遞。
alpha
驗(yàn)證此規(guī)則的值必須全部由字母字符構(gòu)成。
alpha_dash
驗(yàn)證此規(guī)則的值必須全部由字母、數(shù)字、中劃線(xiàn)或下劃線(xiàn)字符構(gòu)成。
alpha_num
驗(yàn)證此規(guī)則的值必須全部由字母和數(shù)字構(gòu)成。
before:date
驗(yàn)證此規(guī)則的值必須在給定日期之前,日期將通過(guò) PHP 函數(shù) strtotime 傳遞。
between:min,max
驗(yàn)證此規(guī)則的值必須在給定的 min 和 max 之間。字符串、數(shù)字以及文件都將使用大小規(guī)則進(jìn)行比較。
confirmed
驗(yàn)證此規(guī)則的值必須和 foo_confirmation 的值相同。比如,需要驗(yàn)證此規(guī)則的域是 password,那么在輸入中必須有一個(gè)與之相同的 password_confirmation 域。
date
驗(yàn)證此規(guī)則的值必須是一個(gè)合法的日期,根據(jù) PHP 函數(shù) strtotime。
date_format:format
驗(yàn)證此規(guī)則的值必須符合給定的 format 的格式,根據(jù) PHP 函數(shù) date_parse_from_format。
different:field
驗(yàn)證此規(guī)則的值必須與指定的 field 域的值不同。
email
驗(yàn)證此規(guī)則的值必須是一個(gè)合法的電子郵件地址。
exists:table,column
驗(yàn)證此規(guī)則的值必須在指定的數(shù)據(jù)庫(kù)的表中存在。
Exists 規(guī)則的基礎(chǔ)使用
指定列名
'state' => 'exists:states,abbreviation'
您也可以指定更多的條件,將以 "where" 的形式添加到查詢(xún)。
'email' => 'exists:staff,email,account_id,1'
image
驗(yàn)證此規(guī)則的值必須是一個(gè)圖片 (jpeg, png, bmp 或者 gif)。
in:foo,bar,...
驗(yàn)證此規(guī)則的值必須在給定的列表中存在。
integer
驗(yàn)證此規(guī)則的值必須是一個(gè)整數(shù)。
驗(yàn)證此規(guī)則的值必須是一個(gè)合法的 IP 地址。
max:value
驗(yàn)證此規(guī)則的值必須小于最大值 value。字符串、數(shù)字以及文件都將使用大小規(guī)則進(jìn)行比較。
mimes:foo,bar,...
驗(yàn)證此規(guī)則的文件的 MIME 類(lèi)型必須在給定的列表中。
MIME 規(guī)則的基礎(chǔ)使用
'photo' => 'mimes:jpeg,bmp,png'
min:value
驗(yàn)證此規(guī)則的值必須大于最小值 value。字符串、數(shù)字以及文件都將使用大小規(guī)則進(jìn)行比較。
not_in:foo,bar,...
驗(yàn)證此規(guī)則的值必須在給定的列表中不存在。
numeric
驗(yàn)證此規(guī)則的值必須是一個(gè)數(shù)字。
regex:pattern
驗(yàn)證此規(guī)則的值必須符合給定的正則表達(dá)式。
注意: 當(dāng)使用 regex 模式的時(shí)候,有必要使用數(shù)組指定規(guī)則,而不是管道分隔符,特別是正則表達(dá)式中包含一個(gè)管道字符的時(shí)候。
required
驗(yàn)證此規(guī)則的值必須在輸入數(shù)據(jù)中存在。
required_if:field,value
當(dāng)指定的域?yàn)槟硞€(gè)值的時(shí)候,驗(yàn)證此規(guī)則的值必須存在。
required_with:foo,bar,...
僅當(dāng)指定的域存在的時(shí)候,驗(yàn)證此規(guī)則的值必須存在。
required_without:foo,bar,...
僅當(dāng)指定的域不存在的時(shí)候,驗(yàn)證此規(guī)則的值必須存在。
same:field
驗(yàn)證此規(guī)則的值必須與給定域的值相同。
size:value
驗(yàn)證此規(guī)則的值的大小必須與給定的 value 相同。對(duì)于字符串,value 代表字符的個(gè)數(shù);對(duì)于數(shù)字,value 代表它的整數(shù)值,對(duì)于文件,value 代表文件以KB為單位的大小。
unique:table,column,except,idColumn
驗(yàn)證此規(guī)則的值必須在給定的數(shù)據(jù)庫(kù)的表中唯一。如果 column 沒(méi)有被指定,將使用該域的名字。
Unique 規(guī)則的基礎(chǔ)使用
'email' => 'unique:users'
指定列名
'email' => 'unique:users,email_address'
強(qiáng)制忽略一個(gè)給定的 ID
'email' => 'unique:users,email_address,10'
url
驗(yàn)證此規(guī)則的值必須是一個(gè)合法的 URL。
定制錯(cuò)誤消息
如果有需要,您可以使用定制的錯(cuò)誤消息代替默認(rèn)的消息。這里有好幾種定制錯(cuò)誤消息的方法。
傳遞定制消息到驗(yàn)證器
$messages = array(
'required' => 'The :attribute field is required.',
);
$validator = Validator::make($input, $rules, $messages);
注意: :attribute 占位符將被實(shí)際的進(jìn)行驗(yàn)證的域的名字代替,您也可以在錯(cuò)誤消息中使用其他占位符。
其他驗(yàn)證占位符
$messages = array(
'same' => 'The :attribute and :other must match.',
'size' => 'The :attribute must be exactly :size.',
'between' => 'The :attribute must be between :min - :max.',
'in' => 'The :attribute must be one of the following types:
:values',
);
有些時(shí)候,您可能希望只對(duì)一個(gè)指定的域指定定制的錯(cuò)誤消息:
對(duì)一個(gè)指定的域指定定制的錯(cuò)誤消息
$messages = array(
'email.required' => 'We need to know your e-mail address!',
);
在一些情況下,您可能希望在一個(gè)語(yǔ)言文件中指定錯(cuò)誤消息而不是直接傳遞給 Validator。為了實(shí)現(xiàn)這個(gè)目的,請(qǐng)?jiān)?app/lang/xx/validation.php 文件中添加您的定制消息到 custom 數(shù)組。
在語(yǔ)言文件中指定錯(cuò)誤消息
'custom' => array(
'email' => array(
'required' => 'We need to know your e-mail address!',
),
),
定制驗(yàn)證規(guī)則
Laravel 提供了一系列的有用的驗(yàn)證規(guī)則;但是,您可能希望添加自己的驗(yàn)證規(guī)則。其中一種方法是使用 Validator::extend 函數(shù)注冊(cè)定制的驗(yàn)證規(guī)則:
注冊(cè)一個(gè)定制的驗(yàn)證規(guī)則
Validator::extend('foo', function($attribute, $value, $parameters)
{
return $value == 'foo';
});
注意: 傳遞給 extend 函數(shù)的規(guī)則的名字必須符合 "snake cased" 命名規(guī)則。
定制的驗(yàn)證器接受三個(gè)參數(shù):待驗(yàn)證屬性的名字、待驗(yàn)證屬性的值以及傳遞給這個(gè)規(guī)則的參數(shù)。
您也可以傳遞一個(gè)類(lèi)的函數(shù)到 extend 函數(shù),而不是使用閉包:
Validator::extend('foo', 'FooValidator@validate');
注意您需要為您的定制規(guī)則定義錯(cuò)誤消息。您既可以使用一個(gè)行內(nèi)的定制消息數(shù)組,也可以在驗(yàn)證語(yǔ)言文件中進(jìn)行添加。
您也可以擴(kuò)展 Validator 類(lèi)本身,而不是使用閉包回調(diào)擴(kuò)展驗(yàn)證器。為了實(shí)現(xiàn)這個(gè)目的,添加一個(gè)繼承自 Illuminate\Validation\Validator 的驗(yàn)證器類(lèi)。您可以添加在類(lèi)中添加以 validate 開(kāi)頭的驗(yàn)證函數(shù):
擴(kuò)展驗(yàn)證器類(lèi)
<?php
class CustomValidator extends Illuminate\Validation\Validator {
public function validateFoo($attribute, $value, $parameters)
{
return $value == 'foo';
}
}
下面,您需要注冊(cè)定制的驗(yàn)證器擴(kuò)展:
您需要注冊(cè)定制的驗(yàn)證器擴(kuò)展
Validator::resolver(function($translator, $data, $rules, $messages)
{
return new CustomValidator($translator, $data, $rules, $messages);
});
當(dāng)創(chuàng)建一個(gè)定制的驗(yàn)證規(guī)則,您有時(shí)需要為錯(cuò)誤消息定義一個(gè)定制的占位符。為了實(shí)現(xiàn)它,您可以像上面那樣創(chuàng)建一個(gè)定制的驗(yàn)證器,并且在驗(yàn)證器中添加一個(gè) replaceXXX 函數(shù):
protected function replaceFoo($message, $attribute, $rule, $parameters)
{
return str_replace(':foo', $parameters[0], $message);
}
- Laravel學(xué)習(xí)教程之從入口到輸出過(guò)程詳解
- Laravel框架源碼解析之反射的使用詳解
- Laravel源碼解析之路由的使用和示例詳解
- 通過(guò)源碼解析Laravel的依賴(lài)注入
- 源碼分析 Laravel 重復(fù)執(zhí)行同一個(gè)隊(duì)列任務(wù)的原因
- Laravel框架數(shù)據(jù)庫(kù)CURD操作、連貫操作總結(jié)
- PHP開(kāi)發(fā)框架Laravel數(shù)據(jù)庫(kù)操作方法總結(jié)
- Laravel框架中擴(kuò)展函數(shù)、擴(kuò)展自定義類(lèi)的方法
- Laravel框架路由配置總結(jié)、設(shè)置技巧大全
- PHP的Laravel框架中使用消息隊(duì)列queue及異步隊(duì)列的方法
- PHP框架Laravel插件Pagination實(shí)現(xiàn)自定義分頁(yè)
- Laravel 5框架學(xué)習(xí)之向視圖傳送數(shù)據(jù)
- Laravel框架源碼解析之入口文件原理分析
相關(guān)文章
PHP批量刪除、清除UTF-8文件BOM頭的代碼實(shí)例
這篇文章主要介紹了PHP批量刪除、清除UTF-8文件BOM頭的代碼實(shí)例,需要的朋友可以參考下2014-04-04php設(shè)計(jì)模式之觀察者模式的應(yīng)用詳解
本篇文章是對(duì)php中的觀察者模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05關(guān)于Laravel參數(shù)驗(yàn)證的一些疑與惑
這篇文章主要給大家介紹了關(guān)于Laravel參數(shù)驗(yàn)證的一些疑與惑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Laravel 5.4向IoC容器中添加自定義類(lèi)的方法示例
Laravel這個(gè)框架,用起來(lái)方便,理解起來(lái)不簡(jiǎn)單。為什么不簡(jiǎn)單?因?yàn)榘艘淮蠖阉^“先進(jìn)”的概念,其中依賴(lài)注入(DI)和Ioc容器是比較核心的內(nèi)容之一。下面這篇文章主要給大家介紹了關(guān)于Laravel 5.4向IoC容器中添加自定義類(lèi)的相關(guān)資料,需要的朋友可以參考下。2017-08-08PHP json_encode() 函數(shù)詳解及中文亂碼問(wèn)題
這篇文章主要介紹了PHP json_encode() 函數(shù)詳解及中文亂碼問(wèn)題的相關(guān)資料,需要的朋友可以參考下2015-11-11tp5(thinkPHP5框架)使用DB實(shí)現(xiàn)批量刪除功能示例
這篇文章主要介紹了tp5(thinkPHP5框架)使用DB實(shí)現(xiàn)批量刪除功能,結(jié)合實(shí)例形式分析了thinkPHP5前端視圖界面數(shù)據(jù)交互及后臺(tái)使用DB處理數(shù)據(jù)庫(kù)刪除的相關(guān)操作技巧,需要的朋友可以參考下2019-05-05Zend Framework連接Mysql數(shù)據(jù)庫(kù)實(shí)例分析
這篇文章主要介紹了Zend Framework連接Mysql數(shù)據(jù)庫(kù)的方法,以完整實(shí)例形式分析了Zend Framework連接MySQL數(shù)據(jù)庫(kù)的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03PHP實(shí)現(xiàn)把MySQL數(shù)據(jù)庫(kù)導(dǎo)出為.sql文件實(shí)例(仿PHPMyadmin導(dǎo)出功能)
這篇文章主要介紹了PHP實(shí)現(xiàn)把MySQL數(shù)據(jù)庫(kù)導(dǎo)出為.sql文件實(shí)例(仿PHPMyadmin導(dǎo)出功能),需要的朋友可以參考下2014-05-05