資料庫課程作業筆記 - 編寫表單驗證

MARTINPOTTER發表於2019-04-24

表單驗證

參考資料 Laravel 文件 - 表單驗證

首先呢分析一下,表單來自 form 的提交,所以在我們的這個系統中,只有新增與修改,也就是 GET 與 PUT 方法需要對錶單進行驗證。
需要驗證的有必填、輸入字元、長度、上下限和存在這些需求。

這裡說明一下表單驗證 Request 類,這個類封裝了 request 請求,在請求進來時會通過自帶的 Validate 方法對 request 包含的欄位做驗證,成功就會被傳入控制器執行控制器的方法,不成功會返回錯誤碼(好像是402)和錯誤的 Session 並重定向面頁,這時之前的面頁包含的錯誤模板就會生效並輸出錯誤。

建立表單

這裡就展示購買記錄的驗證作為例子,其他根據需要做類似設定。

php artisan make:request PurchaseRequest

這裡建立了一個 Request 檔案,我們編輯一下

<?php
namespace App\Http\Requests;
use App\Models\Purchase;
use Illuminate\Foundation\Http\FormRequest;
class PurchaseRequest 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()
    {
        switch ($this->method()) {
            case 'PUT':
                return [
                    Purchase::EID => 'integer|exists:employees,id',
                    Purchase::CID => 'integer|exists:customers,id',
                    Purchase::PID => 'integer|exists:products,id',
                    Purchase::TOTAL_PRICE => 'numeric|min:0|max:1000000',
                    Purchase::PTIME => 'date|nullable',
                    Purchase::QTY => 'integer|min:0|max:2147483647|nullable'
                ];
            case 'POST':
                return [
                    Purchase::EID => 'required|integer|exists:employees,id',
                    Purchase::CID => 'required|integer|exists:customers,id',
                    Purchase::PID => 'required|integer|exists:products,id',
                    Purchase::TOTAL_PRICE => 'required|numeric|min:0|max:1000000',
                    Purchase::PTIME => 'required|date|nullable',
                    Purchase::QTY => 'required|integer|min:0|max:2147483647|nullable'
                ];
            default:
                return [];
        }
    }
    public function messages()
    {
        return [
            'required' => ':attribute 需要填寫',
            'numeric' => ':attribute 必須是數字',
            'max' =>  ':attribute 大於上限 :max',
            'exists' => ':attribute 不存在',
            'integer' => ':attribute 只能是整數',
            'min' => ':attribute 小於下限 :min'
        ];
    }
    public function attributes()
    {
        return [
            Purchase::EID => '員工',
            Purchase::CID => '顧客',
            Purchase::PID => '產品',
            Purchase::TOTAL_PRICE => '總價格',
            Purchase::PTIME => '購買時間',
            Purchase::QTY => '購買數量'
        ];
    }
}

解釋說明

首先下面這段程式碼是做一個許可權控制的,我們的邏輯比較簡單不做判斷,所以將原來的 false 改成 true

 public function authorize()
    {
        return true;
    }

接下來我們寫 rule 方法,這裡就是判斷的設定了

 public function rules()
    {
        switch ($this->method()) {
            case 'PUT':
                return [
                    Purchase::EID => 'integer|exists:employees,id',
                    Purchase::CID => 'integer|exists:customers,id',
                    Purchase::PID => 'integer|exists:products,id',
                    Purchase::TOTAL_PRICE => 'numeric|min:0|max:1000000',
                    Purchase::PTIME => 'date|nullable',
                    Purchase::QTY => 'integer|min:0|max:2147483647|nullable'
                ];
            case 'POST':
                return [
                    Purchase::EID => 'required|integer|exists:employees,id',
                    Purchase::CID => 'required|integer|exists:customers,id',
                    Purchase::PID => 'required|integer|exists:products,id',
                    Purchase::TOTAL_PRICE => 'required|numeric|min:0|max:1000000',
                    Purchase::PTIME => 'required|date|nullable',
                    Purchase::QTY => 'required|integer|min:0|max:2147483647|nullable'
                ];
            default:
                return [];
        }
    }

可以看到 this->method() 將判斷請求的方法,POST 是新增,PUT 是修改, 我們在 POST 的 Purchase::EID 中寫了 required|integer|exists:employees,id
這裡可以繼續看一下文件下面的方法,required 表示欄位必須存在,這個在PUT 裡面就沒有,因為 PUT 可以區域性修改。
integer 表示整數,exists:employess,id 由於我們知道這是一個外來鍵,所以必須存在於資料表employeeid 當中,不然就返回錯誤。

 public function messages()
    {
        return [
            'required' => ':attribute 需要填寫',
            'numeric' => ':attribute 必須是數字',
            'max' =>  ':attribute 大於上限 :max',
            'exists' => ':attribute 不存在',
            'integer' => ':attribute 只能是整數',
            'min' => ':attribute 小於下限 :min'
        ];
    }

上面這一段寫的是規則的別名,這裡可以自定義我們需要的提示資訊,:attribute 是佔位符,這裡會替換成對於的屬性名。

public function attributes()
    {
        return [
            Purchase::EID => '員工',
            Purchase::CID => '顧客',
            Purchase::PID => '產品',
            Purchase::TOTAL_PRICE => '總價格',
            Purchase::PTIME => '購買時間',
            Purchase::QTY => '購買數量'
        ];
    }

上面則是屬性的自定義名稱。

接著我們完成其他的表單驗證就可以了,下面我們介紹在控制器裡使用這些表單

MARTINPOTTER

相關文章