php validate form,laravel 中validate验证规则 利用FormRequest进行数据验证
namespace?App\Http\Requests;
use?Illuminate\Foundation\Http\FormRequest;
class?AddCartRequest?extends?FormRequest
{
public?function?authorize()
{
return?true;
}
//這兩種寫法都是支持的
public?function?rules(){
return?[
'amount'?=>?['required',?'integer',?'min:1'],
'pid'?=>?'required|integer',
];
}
//如果沒有編寫message?提示信息,
//這里的attributes?默認(rèn)會把?amout?這個(gè)字段替換成??商品數(shù)量
//前提是?這條數(shù)據(jù)沒有經(jīng)過驗(yàn)證
public?function?attributes()
{
return?[
'amount'?=>?'商品數(shù)量'
];
}
public?function?messages()
{
return?[
'sku_id.required'?=>?'請選擇商品'
];
}
}
使用命令行創(chuàng)建驗(yàn)證器G:\phpstudy\WWW\laravel_base>php?artisan?make:request?UserRequest?created?successfully.
帶有回調(diào)函數(shù)的驗(yàn)證,有了這條就能做很多的驗(yàn)證了,舉例說明,你可以想想看public?function?rules()
{
return?[
'sku_id'?=>?[
'required',
function?($attribute,?$value,?$fail)?{
if?(!$sku?=?ProductSku::find($value))?{
return?$fail('該商品不存在');
}
if?(!$sku->product->on_sale)?{
return?$fail('該商品未上架');
}
if?($sku->stock?===?0)?{
return?$fail('該商品已售完');
}
if?($this->input('amount')?>?0?&&?$sku->stock?input('amount'))?{
return?$fail('該商品庫存不足');
}
},
],
'amount'?=>?['required',?'integer',?'min:1'],
];
}
舉例說明一個(gè)簡單的驗(yàn)證:、public?function?rules()
{
return?[
'reason'?=>?'required',
//?判斷用戶提交的地址?ID?是否存在于數(shù)據(jù)庫并且屬于當(dāng)前用戶
'address_id'?????=>?[
'required',
Rule::exists('user_addresses',?'id')->where('user_id',?$this->user()->id),
],
];
}
public?function?attributes()
{
return?[
'reason'?=>?'原因',
];
}
使用回調(diào)函數(shù),對數(shù)組中的數(shù)據(jù)進(jìn)行驗(yàn)證<?php
namespace?App\Http\Requests;
use?Illuminate\Validation\Rule;
use?App\Models\ProductSku;
class?OrderRequest?extends?Request
{
public?function?rules()
{
return?[
//?判斷用戶提交的地址?ID?是否存在于數(shù)據(jù)庫并且屬于當(dāng)前用戶
//?后面這個(gè)條件非常重要,否則惡意用戶可以用不同的地址?ID?不斷提交訂單來遍歷出平臺所有用戶的收貨地址
'address_id'?????=>?[
'required',
Rule::exists('user_addresses',?'id')->where('user_id',?$this->user()->id),
],
'items'??????????=>?['required',?'array'],
'items.*.sku_id'?=>?[?//?檢查?items?數(shù)組下每一個(gè)子數(shù)組的?sku_id?參數(shù)
'required',
function?($attribute,?$value,?$fail)?{
if?(!$sku?=?ProductSku::find($value))?{
return?$fail('該商品不存在');
}
if?(!$sku->product->on_sale)?{
return?$fail('該商品未上架');
}
if?($sku->stock?===?0)?{
return?$fail('該商品已售完');
}
//?獲取當(dāng)前索引
preg_match('/items\.(\d+)\.sku_id/',?$attribute,?$m);
$index?=?$m[1];
//?根據(jù)索引找到用戶所提交的購買數(shù)量
$amount?=?$this->input('items')[$index]['amount'];
if?($amount?>?0?&&?$amount?>?$sku->stock)?{
return?$fail('該商品庫存不足');
}
},
],
'items.*.amount'?=>?['required',?'integer',?'min:1'],
];
}
}
required條件判斷public?function?rules()
{
return?[
'agree'??=>?['required',?'boolean'],
'reason'?=>?['required_if:agree,false'],?//?拒絕退款時(shí)需要輸入拒絕理由
];
}
帶有attributes的驗(yàn)證namespace?App\Http\Requests;
class?UserAddressRequest?extends?Request
{
public?function?rules()
{
return?[
'province'??????=>?'required',
'city'??????????=>?'required',
'district'??????=>?'required',
'address'???????=>?'required',
'zip'???????????=>?'required',
'contact_name'??=>?'required',
'contact_phone'?=>?'required',
];
}
public?function?attributes()
{
return?[
'province'??????=>?'省',
'city'??????????=>?'城市',
'district'??????=>?'地區(qū)',
'address'???????=>?'詳細(xì)地址',
'zip'???????????=>?'郵編',
'contact_name'??=>?'姓名',
'contact_phone'?=>?'電話',
];
}
}
第一個(gè)方法:authorize(),控制用戶訪問權(quán)限
表單請求授權(quán)驗(yàn)證
表單請求類內(nèi)也包含了 authorize 方法。在這個(gè)方法中,你可以檢查經(jīng)過身份驗(yàn)證的用戶確定其是否具有更新給定資源的權(quán)限。比方說,你可以判斷用戶是否擁有更新文章評論的權(quán)限:
/**
* 判斷用戶是否有權(quán)限做出此請求。
*
* @return bool
*/
public function authorize()
{
$comment = Comment::find($this->route('comment'));
return $comment && $this->user()->can('update', $comment);
}
由于所有的表單請求都是繼承了 Laravel 中的請求基類,所以我們可以使用 user 方法去獲取當(dāng)前認(rèn)證登錄的用戶。同時(shí)請注意上述例子中對 route 方法的調(diào)用。這個(gè)方法允許你在被調(diào)用的路由上獲取其定義的 URI 參數(shù),譬如下面例子中的 {comment} 參數(shù):
如果 authorize 方法返回 false,則會自動返回一個(gè)包含 403 狀態(tài)碼的 HTTP 響應(yīng),也不會運(yùn)行控制器的方法。
如果你打算在應(yīng)用程序的其它部分處理授權(quán)邏輯,只需從 authorize 方法返回 true:
/**
* 判斷用戶是否有權(quán)限進(jìn)行此請求。
*
* @return bool
*/
public function authorize()
{
return true;
}
第二個(gè)方法:$rules(),返回驗(yàn)證的數(shù)組
第三個(gè)方法:$message(),返回自定義的錯(cuò)誤信息
原來控制器寫法:
傳統(tǒng)上我們這樣使用,但是造成每個(gè)controller都需要對這些參數(shù)單獨(dú)判斷.代碼復(fù)用率不高.
public?function?navSet(Request?$request)
{
$validator?=?Validator::make($request->all(),?[
'h5_id'?=>?'required?|int',
'font_color'=>'string|nullable',
'select_color'=>'string|nullable',
'background_color'=>'string|nullable',
'position'=>'int|required|?between:0,1'
]);
if?($validator->fails())?{
return?$this->output(null,'參數(shù)有誤,請重試!',500);
}
$request_params=$request->all();
//接下來實(shí)現(xiàn)你的業(yè)務(wù)邏輯....
}
當(dāng)我們抽離出來參數(shù)驗(yàn)證層的時(shí)候,
public?function?navSet(NavRequest?$request)//將你抽離的參數(shù)層綁定到這里
{
$request_params=$request->all();
//接下來處理你的業(yè)務(wù)邏輯...
}
這樣不管你在哪里綁定Navrequest這個(gè)參數(shù)驗(yàn)證類的時(shí)候,都會對參數(shù)進(jìn)行驗(yàn)證
驗(yàn)證錯(cuò)誤信息的返回
在這個(gè)地方我是寫接口的,無論如何都接收不到錯(cuò)誤信息.然后查看FoemRequest的錯(cuò)誤返回信息:
看到這里這樣寫:如下圖.
protected?function?failedValidation(Validator?$validator)
{
throw?(new?ValidationException($validator))
->errorBag($this->errorBag)
->redirectTo($this->getRedirectUrl());
}
public?function?rules(){
return?[
'account'=>[
'required',
'regex:/^1[34578][0-9]\d{4,8}|(\w)+(\.\w+)*@(\w)+((\.\w+)+)|[0-9a-zA-Z_]+$/',//驗(yàn)證為手機(jī)號,郵箱,或帳號
],
'password'=>'required|between:6,18',//驗(yàn)證密碼
];
}
public?function?messages(){
return?[
'account.required'?=>?'帳號不能為空',
'account.regex'?=>?'帳號不合法',
'password.required'??=>?'密碼不能為空',
'password.between'??=>?'密碼錯(cuò)誤',
];
}
看一看圖文教程:
1、首先創(chuàng)建驗(yàn)證器
如果是false ,則禁止訪問,也不會運(yùn)行controller,且會返回一個(gè)http 403?的狀態(tài)碼
User.phpnamespace?App\Http\Requests;
use?Illuminate\Foundation\Http\FormRequest;
use?Illuminate\Contracts\Validation\Validator;
class?User?extends?FormRequest?{
/**
*?Determine?if?the?user?is?authorized?to?make?this?request.
*
*?@return?bool
*/
public?function?authorize()?{
return?TRUE;
}
/**
*?Get?the?validation?rules?that?apply?to?the?request.
*
*?@return?array
*/
public?function?rules()?{
return?[
'id'?=>?'required|int'
];
}
protected?function?failedValidation(Validator?$validator)?{
//echo?'1111111111';
var_dump($validator->getMessageBag());
exit;
/*??throw?(new?ValidationException($validator))
->errorBag($this->errorBag)
->redirectTo($this->getRedirectUrl());*/
}
}
驗(yàn)證規(guī)則中,正則的寫法:class?User?extends?FormRequest?{
/**
*?Determine?if?the?user?is?authorized?to?make?this?request.
*
*?@return?bool
*/
public?function?authorize()?{
return?TRUE;
}
/**
*?Get?the?validation?rules?that?apply?to?the?request.
*
*?@return?array
*/
public?function?rules()?{
return?[
'id'?=>?'required|int',
'phone'=>[
'required',
'regex:/^1\d{10}$/'
//'regex:/^1[34578][0-9]\d{4,8}|(\w)+(\.\w+)*@(\w)+((\.\w+)+)|[0-9a-zA-Z_]+$/'
]
];
}
public?function?attributes()?{
return?[
'phone'=>'手機(jī)號'
];
}
public?function?messages()?{
return?[
'phone.required'=>'手機(jī)號不能為空',
'phone.regex'=>'手機(jī)號不正確',
];
}
protected?function?failedValidation(Validator?$validator)?{
//echo?'1111111111';
var_dump($validator->getMessageBag());
exit;
/*??throw?(new?ValidationException($validator))
->errorBag($this->errorBag)
->redirectTo($this->getRedirectUrl());*/
}
}
public?function?rules()?{
return?[
'id'?=>?'required|int',
'phone'?=>?[
'required',
'regex:/^1\d{10}$/'
//'regex:/^1[34578][0-9]\d{4,8}|(\w)+(\.\w+)*@(\w)+((\.\w+)+)|[0-9a-zA-Z_]+$/'
],
'age'?=>?[
'required',
'int',
function?($attribute,?$value,?$fail)?{
//這里可以做邏輯驗(yàn)證?注意?在這里??$attribute?是屬性名,且不能和messages中的值別名替換。
if($value<10?||?$value>100?){
return?$fail($attribute.'不能小于10歲且不能大于100');
}
}
]
];
}
public?function?attributes()?{
return?[
'phone'?=>?'手機(jī)號',
'age'?=>'年齡'
];
}
public?function?messages()?{
return?[
'phone.required'?=>?'手機(jī)號不能為空',
'phone.regex'?=>?'手機(jī)號不正確',
];
}
昨日驗(yàn)證通過 這里的方法重寫,得到pathinfo上的值,就可以實(shí)現(xiàn)路由驗(yàn)證/**
*?Create?the?default?validator?instance.
*
*?@param??\Illuminate\Contracts\Validation\Factory??$factory
*?@return?\Illuminate\Contracts\Validation\Validator
*/
protected?function?createDefaultValidator(ValidationFactory?$factory)
{
$data=array_merge($this->route()->parameters(),$this->validationData());
//echo?"
";//echo?__FILE__."??".__LINE__."
";
//dd($pid);
//echo?"
";//exit;
//???dd($this->validationData());
return?$factory->make(
$data,?$this->container->call([$this,?'rules']),
$this->messages(),?$this->attributes()
);
}
建議重寫這個(gè)方法,
/**
*?Get?data?to?be?validated?from?the?request.
*
*?@return?array
*/
protected?function?validationData()
{
return?$this->all();
return?array_merge($this->route()->parameters(),$this->all());?這樣既可實(shí)現(xiàn)pathinfo上的值驗(yàn)證,?這是有順序的,為了和?laravel的取值保持一致,先?get、post然后才pathinfo
}
validator 擴(kuò)展:$this->app['validator']->extend('captcha',?function?($attribute,?$value,?$parameters)?{
return?captcha_check($value);
});
//?Validator?extensions
$this->app['validator']->extend('captcha_api',?function?($attribute,?$value,?$parameters)?{
return?captcha_api_check($value,?$parameters[0]);
});
$rules?=?[
'result'?=>?'sometimes|integer|in:1,2',
'deviceSource'?=>?'sometimes|integer|in:'?.?implode(',',?array_filter(SourceEnum::keys())),
'startTime'?=>?'sometimes|date',
'endTime'?=>?'sometimes|date|after:startTime'
];
$customAttributes?=?[
'result'?=>?'結(jié)果',
'deviceSource'?=>?'檢測設(shè)備',
'startTime'?=>?'起始時(shí)間',
'endTime'?=>?'截止時(shí)間'
];
總結(jié)
以上是生活随笔為你收集整理的php validate form,laravel 中validate验证规则 利用FormRequest进行数据验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python输入一个整数列表 列表元素为
- 下一篇: ios键盘done中文_IOS_IOS关