3分鐘短文:Laravel把資料驗證的手伸向“請求體”

程式設計師小助手發表於2020-10-11

引言

上一章講述了表單資料驗證,從前端頁面接收使用者的輸入資訊,通過POST方法提交資料到相應路由地址,

並使用Request請求體的validate方法,預設傳入request()->input()的引數,並呼叫傳入的驗證規則,

從而實現資料的初步篩選。

img

把資料驗證,驗證規則,和控制器的邏輯處理程式碼混合在一起,是不是有點怪怪的?我們說,一箇中間層只做一件事情,這樣才能鬆耦合,提高魯棒性。

所以有了這篇文章,教你把資料驗證提煉出來。

程式碼時間

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'
    ];
}

規則所表示的意義我們在上一節已經詳細介紹了。我們把目光放在如何使用該請求體。

回到控制器 EventControllerstore 方法內,這個是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 協議》,轉載必須註明作者和本文連結
write-less-do-more-make-you-out-of-door

相關文章