對于后端開發(fā)而言,前端request請求中的參數(shù)校驗是一個必不可少的環(huán)節(jié)。無論傳來的參數(shù)是id還是email還是其他的參數(shù),我們都要對參數(shù)的類型、大小、格式等等做這樣或者那樣的校驗,然后才進行邏輯處理,以確保邏輯處理時萬無一失,不會出現(xiàn)異樣。于是乎,在controller層中就會出現(xiàn)一大坨的校驗代碼,這些校驗代碼甚至有時候都超過了正常的邏輯代碼的數(shù)量,對于程序的擴展和維護很不利的。
但是,laravel為我們提供了一個很好的服務(wù)去解決參數(shù)校驗這個問題,它就是----Validate。
首先,我們需要建一個路由,暫時就叫"test"吧,然后test對應(yīng)著TestController中的test方法。
Route::get('test', 'TestController@test');
class TestController extends Controller
{
public function test(Request $request)
{
}
}
假設(shè)請求的參數(shù)中需要id、title這兩個參數(shù),并且id必須是數(shù)字,且長度是1到10,并且是DB中的一行數(shù)據(jù)的主鍵、title必須是字符串,id和title都不能為空。一般的框架在寫的時候就會先取到id和title,然后對取到的id和title進行“是否是空”、“是否長度在1到10之間”、“通過id能否在數(shù)據(jù)庫中找到數(shù)據(jù)”等等繁瑣的校驗,利用laravel的“Validate”你只需要這樣就可以了。
public function test(Request $request)
{
$validate = Validator::make($request->all(), [
'id' => 'required|integer|between:1,10',
'title' => 'required|string'
]);
如果沒有錯誤,就會繼續(xù)往下進行邏輯處理。假如說校驗不通過,例如id不在1和10之間,可以通過“validate”實例中的“errors()”方法,得到所有的錯誤,然后將錯誤放回給客戶端,如果想返回錯誤隊列中的頭一個錯誤,就寫$validate->errors()->first(),如果想返回所有錯誤列表,就寫“$validate->errors()->all()”。如下:
if($validate->fails())
{
return $validate->errors()->first();
}
或者返回
if($validate->fails())
{
return $validate->errors()->all();
}
假如請求參數(shù)中的id不是一個數(shù)字,而是字符串,結(jié)果就會出現(xiàn):
你可能會想:返回結(jié)果能否使中文?答案當然是可以,你可以針對自己的程序,換成你任何想要的語言:
在項目中找到“resources”目錄下的“l(fā)ang” 中的 “en”文件夾中的“validation.php”文件,
打開,然后找到這一行:
'integer' => 'The :attribute must be an integer.',
這句話除了“:attribute”是不是其他字和返回結(jié)果一模一樣?或許你已經(jīng)猜到了:這就是你調(diào)用的‘integer'方法的返回結(jié)果,“:attribute”是個變量,是你傳的“id”!現(xiàn)在,你可以寫成任何語言,我把它改為中文:
'integer' => ':attribute 必須是數(shù)字!'
然后我們再看返回結(jié)果:
完美!只要你利用Validator的make方法,在請求參數(shù)數(shù)組中對應(yīng)上‘integer'、“required”等字符串就可以利用laravel提供的服務(wù),對請求參數(shù)進行“數(shù)字”、“判空”等校驗,laravel提供的眾多校驗方法,可以在laravel官網(wǎng)查詢。(ps:或者直接查詢validation.php這個文件!)
你或許還會想:我現(xiàn)在校驗了id是否為空,id是否是數(shù)字,我還想校驗id對應(yīng)的數(shù)據(jù)能否在數(shù)據(jù)庫中查得到!這能實現(xiàn)嗎?
答案是:完全可以!在上篇文章中我介紹了laravel核心是一個IOC容器,你可以很方便的擴展任何服務(wù)注入到容器中!自定義validate服務(wù)也不例外!
我們首先創(chuàng)建一個provider
php artisan make:provider TestProvider
然后在boot方法里寫下:
public function boot()
{
Validator::extend('user', function($attribute, $value, $parameters) {
return !is_null(User::find($value));
});
}
這行代碼很好理解吧:1、調(diào)用“Validator”的“extend”方法。2、傳給他倆個參數(shù),一個是“user”,一個是返回值為boolen類型的callback 函數(shù)。3、函數(shù)中判斷User表中是否含有$value值數(shù)據(jù),如果有,返回true,如果沒有,返回false。
然后在“config”的“app.php”中注冊上這個provider。(如果不清楚,可以去看前一篇文章“三分鐘學會laravel服務(wù)擴展”)
然后在validation.php中寫上:
然后在校驗方法中添上“user”
$validate = Validator::make($request->all(), [
'id' => 'required|integer|between:1,10|user',
'title' => 'required|string'
]);
數(shù)據(jù)庫中插入數(shù)據(jù),開始檢驗:
OK,大功告成!是不是很簡單?laravel框架是不是很強大?
以上這篇laravel請求參數(shù)校驗方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Laravel 5.5中為響應(yīng)請求提供的可響應(yīng)接口詳解
- 讓Laravel API永遠返回JSON格式響應(yīng)的方法示例
- Laravel+Dingo/Api 自定義響應(yīng)的實現(xiàn)
- laravel http 自定義公共驗證和響應(yīng)的方法
- Laravel5.1 框架Request請求操作常見用法實例分析
- 跟我學Laravel之請求與輸入
- 跟我學Laravel之請求(Request)的生命周期
- 解決laravel 出現(xiàn)ajax請求419(unknown status)的問題
- Laravel獲取當前請求的控制器和方法以及中間件的例子
- Laravel框架處理用戶的請求操作詳解
- Laravel5.1 框架響應(yīng)基本用法實例分析