引言
上一章講述了表單資料驗證,從前端頁面接收使用者的輸入資訊,通過POST方法提交資料到相應路由地址,
並使用Request請求體的validate方法,預設傳入request()->input()的引數,並呼叫傳入的驗證規則,
從而實現資料的初步篩選。
把資料驗證,驗證規則,和控制器的邏輯處理程式碼混合在一起,是不是有點怪怪的?我們說,一箇中間層只做一件事情,這樣才能鬆耦合,提高魯棒性。
所以有了這篇文章,教你把資料驗證提煉出來。
程式碼時間
laravel在請求相關的業務邏輯上設計的很靈活,你完全可以把驗證流程從控制器方法中剝離出去,
這樣你只需在相關的層面,專注於相關的邏輯就可以了。
首先使用命令列建立一個請求體物件:
php artisan make:request EventStoreRequest
輸出內容如下:
Request created successfully
上述方法會生成一個檔案位於 app/Http/Requests/EventStoreRequest.php,我們把系統預設的程式碼貼出來:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EventStoreRequest extends FormRequest
{
public function authorize()
{
return false;
}
public function rules()
{
return [];
}
}
其中 authorize方法用於實現邏輯判斷,那些使用者,或者滿足那些條件可以使用該請求體。返回 false表示所有呼叫均不被允許驗證,也就是不會呼叫任何 rules方法宣告的規則。
此處我們還沒有關於許可權判斷的需求,所以,讓所有呼叫此請求類的方法,都預設呼叫驗證規則,只需修改上述方法如下:
public function authorize()
{
return true;
}
其中 rules方法執行了需要執行的驗證器的規則,laravel預設內建了很多常用規則,基本夠用。使用方法見上一節我們的文章。
現在,把上一節中所使用的驗證規則拿來,修改 rules 方法如下:
public function rules()
{
return [
'name' => 'required|min:10|max:50',
'max_attendees' => 'required|integer|digits_between:2,5',
'description' => 'required'
];
}
規則所表示的意義我們在上一節已經詳細介紹了。我們把目光放在如何使用該請求體。
回到控制器 EventController 的 store 方法內,這個是restfulapi 中用於接收POST請求體資料,並寫入資料庫的操作。此處我們需要指定請求體型別,使其預設使用 EventStoreRequest,這樣就可以發揮驗證規則的作用了。
使用依賴注入方式,直接在 store 方法內例項化一個請求體:
use App\Http\Requests\EventStoreRequest;
public function store(EventStoreRequest $request)
{
$event = Event::create($request->input());
return redirect()->route('events.show', ['event' => $event]);
}
使用此方法,使我們的程式碼精簡了很多。最重要的資料驗證,交給了 EventStoreRequest 類來完成,這就完成了程式碼層的分離。
預設內建的驗證規則所返回的錯誤資訊提示,不滿足使用的話,還可以自定義,在 EventStoreRequest 內實現 messages 方法就可以了:
public function messages()
{
return [
'required' => '必填欄位 :attribute',
'name.min' => '最少10個字元',
'name.max' => '最多50個字元',
'max_attendees.digits_between' => '2-5位數字'
];
}
這完全是上一章的手動自定的返回資訊,寫在此處作為陣列返回就搞定了。
寫在最後
本文深入laravel資料驗證的方法,從特殊走向一般,並嘗試把驗證相關的程式碼從控制器內分離出來。使用自定義的請求體類,成功實現了程式碼的分離,而可控制性也更強了。而驗證規則,和自定義的錯誤資訊,則沒有一絲絲改變!
Happy coding :-)
我是@程式設計師小助手,專注程式設計知識,圈子動態的IT領域原創作者
本作品採用《CC 協議》,轉載必須註明作者和本文連結