您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Laravel中怎么實現表單驗證分層設計,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
composer require w7/engine-validate
首先此驗證器也是基于illuminate/validation
的,關于它的詳細說明可以直接查看它的文檔,這里就不過多說明了。
首先我們建立一個和控制器相對應的驗證層
app ├── Http │ ├── Controllers │ │ └── UserController.php │ └── Validate │ └── UserValidate.php
驗證器代碼:
class UserValidate extends Validate{ protected $rule = [ 'user' => 'required|email', 'pass' => 'required|alpha_num' ]; protected $message = [ 'user.required' => '賬號不可為空', 'pass.required' => '密碼不可為空', ]; protected $customAttributes = [ 'user' => '賬號', 'pass' => '密碼', ];}
控制器代碼:
class UserController extends BaseController{ use AuthorizesRequests, DispatchesJobs, ValidatesRequests; public function login(Request $request) { $data = UserValidate::make()->check($request->all()); }}
這個時候,如果值不符合要求,會拋出一個ValidateException
異常,我們可以選擇手動捕獲,也可以選擇在異常捕獲類里面做一個全局的處理:
public function render($request, Throwable $e) { if ($e instanceof ValidateException) { return response()->json([ 'code' => -1, 'message' => $e->getMessage() ]); } return parent::render($request, $e); }
這樣我們就不需要再控制器里面管理任何的驗證異常了。
此時,控制器中的$data
一定是符合我們需求的數據,然后可以緊接著做對應的業務處理
這個時候,如果我們的UserController
控制器中又添加了一個register
方法,在以上兩個字段的需求同時增加了name
,應該如何處理呢?
我們可以使用類的$scene
屬性來指定某一場景下需要驗證的字段
驗證器代碼修改如下:
class UserValidate extends Validate{ protected $rule = [ 'user' => 'required|email', 'pass' => 'required|alpha_num', 'name' => 'required|alpha' ]; protected $message = [ 'user.required' => '賬號不可為空', 'pass.required' => '密碼不可為空', ]; protected $customAttributes = [ 'user' => '賬號', 'pass' => '密碼', 'name' => '用戶名稱', ]; protected $scene = [ 'login' => ['user', 'pass'], 'register' => ['user', 'pass', 'name'] ];}
此時:login
場景對應的驗證user
和pass
字段,而register
場景對應的驗證user
,pass
,name
字段
控制器代碼修改如下:
class UserController extends BaseController{ use AuthorizesRequests, DispatchesJobs, ValidatesRequests; public function login(Request $request) { $data = UserValidate::make()->scene('login')->check($request->all()); } public function register(Request $request) { $data = UserValidate::make()->scene('register')->check($request->all()); }}
使用驗證器的scene
方法來指定當前需要驗證的場景名稱
默認我們一個控制器對應一個驗證器,一個方法對應一個場景名稱,基于此特點,我們可以編寫一些更為簡易的方法來解決驗證,我們可以編寫一個中間件來解決此問題,點擊查看文檔說明,中間件完整命名空間為:Itwmw\Validate\Middleware\Laravel\ValidateMiddleware
首先我們需要為他指定控制器和驗證器的對應關系,在app/Providers
目錄下新建一個ValidateServiceProvider.php
文件,寫入如下代碼:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Itwmw\Validate\Middleware\ValidateMiddlewareConfig; class ValidateServiceProvider extends ServiceProvider{ public function register() { ValidateMiddlewareConfig::instance() ->setAutoValidatePath('App\\Http\\Controllers\\', 'App\\Http\\Validate\\'); }}
其中setAutoValidatePath
為指定控制器和驗證器的對應關系,可以設定多個,不限制數量,然后我們將ValidateServiceProvider
注冊一下,在config/app.php
文件中找到providers
,在其中添加App\Providers\ValidateServiceProvider::class
注意:不可以放在
Illuminate\Validation\ValidationServiceProvider::class
之前
這個時候,我們可以將中間件注冊為全局中間件,也可以不注冊,注冊方法:中間件《Laravel 7 中文文檔》
定義路由:
Route::middleware(ValidateMiddleware::class)->group(function () { Route::any('/login', [\App\Http\Controllers\UserController::class, 'login']); Route::any('/register', [\App\Http\Controllers\UserController::class, 'register']);});
控制器代碼修改如下:
class UserController extends BaseController{ use AuthorizesRequests, DispatchesJobs, ValidatesRequests; public function login(Request $request) { $data = get_validate_data($request); } public function register(Request $request) { $data = get_validate_data($request); }}
以上就是Laravel中怎么實現表單驗證分層設計,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。