為了簡化程式碼提高程式碼的複用性,引入 form request 去驗證
-
專案在剛開始驗證資料統一在控制器驗證 貼出控制器驗證程式碼
$data = $request->all();
//請求引數驗證
$rules = [
'content' => 'required|max:255'
];
$messages = [
'required' => '必填',
'max' =>'最大長度不超過255'
];
$validator = Validator::make(['content'=>$data['content']], $rules, $messages);
//如果驗證出錯誤,提示錯誤
if ($validator->fails()) {
return ........
}注意在控制器的頭部引入門面 validator use Illuminate\Support\Facades\Validator
-
以上在控制器驗證 已經滿足專案的需求, 但是這樣控制器的程式碼量很大 也不能提高程式碼的複用性。 所以本人研究使用form request 去做驗證步驟如下
首先建立 form request 的程式碼 可以使用命令 可以直接用檔案. 上程式碼。 這個要注意下目錄結構
1>
<?php
namespace App\Http\Requests\Api;
use Illuminate\Foundation\Http\FormRequest;
class Feedback 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 [
'content' => 'required',
'title' => 'required',
];
}
public function messages(){
return [
'content.required' => '帳號不能為空',
'title.required' => '標題不能為空',
];
}
}
2> 控制器中使用 頭部use 引入 request 型別提示注入到需要使用的控制器的方法中。 這時在請求的時候會先去驗證 然後才可以進去方法內部。
use App\Http\Requests\Api\Feedback as rFeedback;
class FeedbackController extends ApiController
{
//新增反饋
public function add(rFeedback $request)
{
}
}
3> 用postmen 去測試url 會返回 如下格式。這個格式是larevel 通用的。注意 頭部加X-Requested-With:XMLHttpRequest
ajax 請求會返回json。 如果是頁面請求會自動返回到上一頁 並且帶回錯誤資訊。
{
"message": "The given data was invalid.",
"errors": {
"content": [
"帳號不能為空"
],
"title": [
"標題不能為空"
]
}
}
4> 我的錯誤資訊介面 和laravel 預設的格式 不一樣。 所以我必須要重寫返回的格式。找到檔案 app\exceptions\handler.php加入如下程式碼 這樣就可以根據自己想要的去定義錯誤資訊的返回。
// protected function invalidJson($request, ValidationException $exception)
// {
// return response()->json([
// 'status'=> $exception->status,
// 'msg' => $exception->getMessage(),
// 'errors' => $exception->errors(),
// ]);
//}
5》最後改成了我自己需要返回的資訊
{
"status": 422,
"msg": "The given data was invalid.",
"errors": {
"content": [
"帳號不能為空"
],
"title": [
"標題不能為空"
]
}
}
如果錯誤資訊只需要返回第一條的第一個 使用如下程式碼: return $this->message(current($exception->errors())[0], 'error');
本人請自測試程式碼有效。
本作品採用《CC 協議》,轉載必須註明作者和本文連結