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?默認會把?amout?這個字段替換成??商品數量
//前提是?這條數據沒有經過驗證
public?function?attributes()
{
return?[
'amount'?=>?'商品數量'
];
}
public?function?messages()
{
return?[
'sku_id.required'?=>?'請選擇商品'
];
}
}
使用命令行創建驗證器G:\phpstudy\WWW\laravel_base>php?artisan?make:request?UserRequest?created?successfully.
帶有回調函數的驗證,有了這條就能做很多的驗證了,舉例說明,你可以想想看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'],
];
}
舉例說明一個簡單的驗證:、public?function?rules()
{
return?[
'reason'?=>?'required',
//?判斷用戶提交的地址?ID?是否存在于數據庫并且屬于當前用戶
'address_id'?????=>?[
'required',
Rule::exists('user_addresses',?'id')->where('user_id',?$this->user()->id),
],
];
}
public?function?attributes()
{
return?[
'reason'?=>?'原因',
];
}
使用回調函數,對數組中的數據進行驗證<?php
namespace?App\Http\Requests;
use?Illuminate\Validation\Rule;
use?App\Models\ProductSku;
class?OrderRequest?extends?Request
{
public?function?rules()
{
return?[
//?判斷用戶提交的地址?ID?是否存在于數據庫并且屬于當前用戶
//?后面這個條件非常重要,否則惡意用戶可以用不同的地址?ID?不斷提交訂單來遍歷出平臺所有用戶的收貨地址
'address_id'?????=>?[
'required',
Rule::exists('user_addresses',?'id')->where('user_id',?$this->user()->id),
],
'items'??????????=>?['required',?'array'],
'items.*.sku_id'?=>?[?//?檢查?items?數組下每一個子數組的?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('該商品已售完');
}
//?獲取當前索引
preg_match('/items\.(\d+)\.sku_id/',?$attribute,?$m);
$index?=?$m[1];
//?根據索引找到用戶所提交的購買數量
$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'],?//?拒絕退款時需要輸入拒絕理由
];
}
帶有attributes的驗證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'??????=>?'地區',
'address'???????=>?'詳細地址',
'zip'???????????=>?'郵編',
'contact_name'??=>?'姓名',
'contact_phone'?=>?'電話',
];
}
}
第一個方法:authorize(),控制用戶訪問權限
表單請求授權驗證
表單請求類內也包含了 authorize 方法。在這個方法中,你可以檢查經過身份驗證的用戶確定其是否具有更新給定資源的權限。比方說,你可以判斷用戶是否擁有更新文章評論的權限:
/**
* 判斷用戶是否有權限做出此請求。
*
* @return bool
*/
public function authorize()
{
$comment = Comment::find($this->route('comment'));
return $comment && $this->user()->can('update', $comment);
}
由于所有的表單請求都是繼承了 Laravel 中的請求基類,所以我們可以使用 user 方法去獲取當前認證登錄的用戶。同時請注意上述例子中對 route 方法的調用。這個方法允許你在被調用的路由上獲取其定義的 URI 參數,譬如下面例子中的 {comment} 參數:
如果 authorize 方法返回 false,則會自動返回一個包含 403 狀態碼的 HTTP 響應,也不會運行控制器的方法。
如果你打算在應用程序的其它部分處理授權邏輯,只需從 authorize 方法返回 true:
/**
* 判斷用戶是否有權限進行此請求。
*
* @return bool
*/
public function authorize()
{
return true;
}
第二個方法:$rules(),返回驗證的數組
第三個方法:$message(),返回自定義的錯誤信息
原來控制器寫法:
傳統上我們這樣使用,但是造成每個controller都需要對這些參數單獨判斷.代碼復用率不高.
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,'參數有誤,請重試!',500);
}
$request_params=$request->all();
//接下來實現你的業務邏輯....
}
當我們抽離出來參數驗證層的時候,
public?function?navSet(NavRequest?$request)//將你抽離的參數層綁定到這里
{
$request_params=$request->all();
//接下來處理你的業務邏輯...
}
這樣不管你在哪里綁定Navrequest這個參數驗證類的時候,都會對參數進行驗證
驗證錯誤信息的返回
在這個地方我是寫接口的,無論如何都接收不到錯誤信息.然后查看FoemRequest的錯誤返回信息:
看到這里這樣寫:如下圖.
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_]+$/',//驗證為手機號,郵箱,或帳號
],
'password'=>'required|between:6,18',//驗證密碼
];
}
public?function?messages(){
return?[
'account.required'?=>?'帳號不能為空',
'account.regex'?=>?'帳號不合法',
'password.required'??=>?'密碼不能為空',
'password.between'??=>?'密碼錯誤',
];
}
看一看圖文教程:
1、首先創建驗證器
如果是false ,則禁止訪問,也不會運行controller,且會返回一個http 403?的狀態碼
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());*/
}
}
驗證規則中,正則的寫法: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'=>'手機號'
];
}
public?function?messages()?{
return?[
'phone.required'=>'手機號不能為空',
'phone.regex'=>'手機號不正確',
];
}
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)?{
//這里可以做邏輯驗證?注意?在這里??$attribute?是屬性名,且不能和messages中的值別名替換。
if($value<10?||?$value>100?){
return?$fail($attribute.'不能小于10歲且不能大于100');
}
}
]
];
}
public?function?attributes()?{
return?[
'phone'?=>?'手機號',
'age'?=>'年齡'
];
}
public?function?messages()?{
return?[
'phone.required'?=>?'手機號不能為空',
'phone.regex'?=>?'手機號不正確',
];
}
昨日驗證通過 這里的方法重寫,得到pathinfo上的值,就可以實現路由驗證/**
*?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()
);
}
建議重寫這個方法,
/**
*?Get?data?to?be?validated?from?the?request.
*
*?@return?array
*/
protected?function?validationData()
{
return?$this->all();
return?array_merge($this->route()->parameters(),$this->all());?這樣既可實現pathinfo上的值驗證,?這是有順序的,為了和?laravel的取值保持一致,先?get、post然后才pathinfo
}
validator 擴展:$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'?=>?'結果',
'deviceSource'?=>?'檢測設備',
'startTime'?=>?'起始時間',
'endTime'?=>?'截止時間'
];
總結
以上是生活随笔為你收集整理的php validate form,laravel 中validate验证规则 利用FormRequest进行数据验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python输入一个整数列表 列表元素为
- 下一篇: python和c++无缝对接_总结:Py