表單請求 統一欄位不同場景不同處理

王子昊發表於2019-05-22
  1. 定義一個父類的request,然後搞倆子類request,在子類中實現差異(引用的LiuBo2015,記錄用)
    正在學習 Laravel 5,最近用到了表單驗證請求,寫了一個表單請求驗證的例子,希望對和我一樣的新手有幫助。

使用 Artisan 命令建立一個表單驗證請求類,該類會被建立在 app/Http/Requests/Users 目錄下,可以根據實際情況改變路徑。

php artisan make:request Users/PermissionFormRequest

這個類是作為新增編輯表單驗證的基類使用,其中只定義驗證規則和自定義的錯誤資訊。

    use App\Http\Requests\Request;

    class PermissionFormRequest extends Request {

        protected $rules = [
            'name' => ['required', 'unique:permissions,name'],
            'display_name' => ['required'],
            'description' => ['max:100'],
        ];

        protected $messages = [
            'name.unique' => '“許可權名稱”已存在。',
            'name.required' => '必須填寫“許可權名稱”',
            'display_name.required' => '必須填寫“許可權顯示名稱”。',
            'description.max' => '“許可權說明”不能大於100個字。',
        ];

        public function authorize()
        {
            return true;
        }
    }

在 app/Http/Requests/Users 目錄下建立一個 AddPermissionFormRequest 類用於新增的表單驗證,該類繼承於 PermissionFormRequest 類。

    class AddPermissionFormRequest extends PermissionFormRequest {

        public function rules()
        {
            return $this->rules;
        }

        public function messages()
        {
            return $this->messages;
        }
    }

在 app/Http/Requests/Users 目錄下再建立一個 EditPermissionFormRequest 類用於編輯的表單驗證,該類同樣繼承於 PermissionFormRequest 類,其中使用 $this->route() 來獲取 Uri 引數,這裡是獲取 {id}

    class EditPermissionFormRequest extends PermissionFormRequest {

        public function rules()
        {
            $id = $this->route('id');
            $rules = $this->rules;
            $rules['name'] = ['required', 'unique:permissions,name,'.$id];

            return $rules;
        }

        public function messages()
        {
             return $this->messages;
       }
    }

在控制器類中加入型別提示。

    use App\Http\Requests\Users\AddPermissionFormRequest;
    use App\Http\Requests\Users\EditPermissionFormRequest;

    ...

    public function store(AddPermissionFormRequest $request)
    {
        $permission = new Permission();
        $permission->name = $request->get('name');
        $permission->display_name = $request->get('display_name');
        $permission->description = $request->get('description');
        $permission->save();

        return redirect(route('admin.users.permission.index'));
    }

    public function update(EditPermissionFormRequest $request, $id)
    {
        $permission = Permission::findOrFail($id);
        $permission->name = $request->get('name');
        $permission->display_name = $request->get('display_name');
        $permission->description = $request->get('description');
        $permission->save();

        return redirect(route('admin.users.permission.index'));
    }

當控制器的方法被呼叫前,表單請求已經驗證了,意味著你不需要在控制器裡寫任何的驗證邏輯。它已經驗證完了!

如果驗證失敗,使用者會收到一個重定向請求至上一個頁面。而錯誤資訊也已經儲存至 session 中方便檢視展示。

2.自定義規則:rule

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章