3分鐘短文:Laravel把數據驗證的手伸向「請求體」

2020-10-13 程式設計師小助手

引言

上一章講述了表單數據驗證,從前端頁面接收用戶的輸入信息,通過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'   ];}

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

回到控制器 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領域原創作者

相關焦點

  • 3分鐘短文 | Laravel 表單驗證數組的數據
    引言本文說一個小的知識點,在表單驗證中,對數組數據進行驗證, 我們需要進行兩項,一項是數組本身的驗證,一項是數組元素的驗證。學習時間例如有一個POST請求過來的數據,由3個數組組成,name,amount,description。
  • 3分鐘短文:Laravel請求體內JSON格式數據的處理辦法
    引言前幾篇文章我們講了表單數據的接收,驗證等功能。也說到了傳送的數組如何處理, 今天我們說一下如果傳送的數據是JSON格式,其處理流程。": "Boston" }, { "name": "Dave", "location": "Lancaster" }]前端請求數據時,可以採用純手動組裝JSON字符串,然後整體提交的方式:$.ajax({type: "POST", url: "/people", data: '[{ "name": "John", "location": "Boston
  • 3分鐘短文:Laravel請求體內JSON格式數據的處理辦法
    引言前幾篇文章我們講了表單數據的接收,驗證等功能。也說到了傳送的數組如何處理, 今天我們說一下如果傳送的數據是JSON格式,其處理流程。$json = file_get_contents(&39;);$data = json_decode($json,true);解析為關聯數組,輸出內容大概如下:[ { &34;: &34;, &34;: &34; }, { &34;: &34;, &34;: &34; }]前端請求數據時
  • 3分鐘短文:Laravel表單驗證的「指揮中心」:表單請求類
    那麼有沒有什麼好的設計方法,把數據驗證獨立出來這就是本文我們重點要介紹的 FormRequest 表單請求類。好了,授權做完了,下面該驗證規則上場了,一旦通過驗證的數據進入到驗證環節,就要執行 rules 方法內定義的規則,我們修改代碼如下:public function rules(){    return [   'body'
  • 3分鐘短文:Laravel請求對象方法極多,可不是花拳繡腿
    代碼時間一個網絡請求在到達應用程式之前,經歷了http的路由匹配,握手連接, 數據發送等等或簡單,或複雜的步驟。也同樣有多重請求方式,如GET POST PUT OPTION DELETE 等等標準協議裡的內容。
  • 3分鐘短文:十年窖藏,Laravel告訴你表單驗證的正確姿勢
    把Request請求的表單數據原封不動地傳入到create方法內, 並寫入了資料庫。當然,在Event模型內,我已經加上 $fillable 用於標記那些可以寫入數據的欄位了,但是仍然不夠。 僅指定欄位可以寫入,但是寫什麼值沒有過濾,是不是缺了一大塊。
  • 3分鐘短文 | Laravel 內3種數據校驗的寫法,你喜歡哪一個?
    這就是本文的重點,說一說laravel中輸入請求的校驗。在第一個規則下,驗證了names欄位必須為array類型,且長度至少為3。接著使用星號匹配數組內元素,要求都是string字符串,且不得重複 distinct,且每個字符串長度最小為3。laravel 5.5 以後的版本,你無需手動實例化 Validaor 對象,可以在 Request 對象直接調用 validate 方法實現。
  • 3分鐘短文 | Laravel 用戶授權原來內置了這麼多方法
    如果有效的數據則進行驗證登陸,如果無效則執行錯誤邏輯。 那麼問題來了,能否手動實現這些邏輯呢。或者說,為了防止無效的暴力請求,在表單開始之初, 能否直接過濾掉一些垃圾請求,過濾掉根本不存在的用戶,或者被禁止的用戶呢?我們需要在 LoginController 內重寫 login 方法。
  • 3分鐘短文|Laravel 用戶授權原來內置了這麼多方法
    引言laravel已經內置了一套授權和權限分配的功能,我們不用從零開始設計,這方便了很多。但是, 因為集成在框架內的緣故,很多時候對於用戶體系甚至有些陌生。本文通過一個簡單的需求,判斷有效用戶, 逐一為大家實現。
  • 3分鐘短文:Laravel控制器用法光速入門
    引言上一章我們介紹了laravel路由註冊中的「花拳繡腿」,樣樣都是那麼優雅而實用。路由傳遞過來的參數,在經過中間件驗證和導向之後,應該去控制器接受處理了。沒有什麼可寫的,我們就寫個 hello world 練練手吧:public function home(){ return 'Hello, World!
  • 3分鐘短文:Laravel的「南天門」,過濾掉七七八八的數據
    引言上一章我們教會大家如何從用戶表單內正確地獲取數據,可是沒有講,獲取到的數據到底有啥用,或者說,有的用戶提交的數據壓根兒就沒正經填,那些錯亂無效的數據,如果直接放到資料庫,純粹是對資料庫的汙染。代碼時間獲取數據的途徑除了早前介紹的在路由地址內通過位置參數綁定的方式, 還有上一章介紹的表單提交的方式,還有一些比如在get請求內附加查詢參數進行傳送的, 不管形式是什麼,我們需要將其統一口徑,將其規劃為規範的數據格式,然後只用把數據發給驗證器
  • 3分鐘短文:說說Laravel頁面會話之間的數據保存用法
    引言我們知HTTP請求是沒有狀態的,兩個請求之間沒有直接的關聯關係。但大多數情況下, 我們需要保持用戶的會話間數據的連續性,這時,為了數據安全起見, 有必要在伺服器上臨時存儲一些上下文數據了。代碼時間在laravel中可以使用系統提供的Session類方便地操作會話數據,而且其存儲介質也是抽象出來的, 可以無縫銜接,
  • 3分鐘短文:Laravel跟用戶打交道,從拿他們的數據開始
    而laravel是偏重後端的,所以為了給後端的開發同學緩衝的時間,我們跳過視圖,先來說說用戶數據的獲取和處理,這幾乎是任何應用必備之功能。laravel把用戶的輸入存儲在 Input 對象內,而從邏輯上看,用戶輸入應該歸屬於請求項的,所以 Request 也繼承了 Input 的方法和數據。
  • 3分鐘短文:Laravel是怎麼發出一封電子郵件的?
    引言上一章我們為發電子郵件準備了貼心的表單,完善的數據驗證,那麼本篇我們講解如何在laravel內發送一封電子郵件。代碼時間laravel集成了熱門且功能強大的SwiftMailer庫,為我們封裝了發送郵件所需要的底層邏輯,所以我們只需關注發送的邏輯, 如何準備電子郵件的內容即可。
  • 3分鐘短文:說說Laravel頁面會話之間的數據保存Session用法
    引言我們知HTTP請求是沒有狀態的,兩個請求之間沒有直接的關聯關係。但大多數情況下, 我們需要保持用戶的會話間數據的連續性,這時,為了數據安全起見, 有必要在伺服器上臨時存儲一些上下文數據了。這就是 session 設計的目的。
  • 3分鐘短文 | Laravel表單驗證沒規則可用?你試試自定義,真香
    學習時間假設有兩個欄位 initial_page 和 end_page,接收到請求參數之後,經過如下的規則過濾:&39; => &39;,&39; => &39;規則中使用 required_with 選項限制一個另一個欄位存在時執行的驗證規則
  • 3分鐘短文 | Laravel 靈活地獲取當前請求的路由地址
    學習時間在 Laravel 4 中你可以使用系統提供的 Route 對象,直接訪問其方法實現:Route::currentRouteName();雖然laravel首先我們仍然可以通過 Route 對象的方法訪問,代碼寫起來像下面這樣:Route::getCurrentRoute()->getPath();因為Route對象屬於請求階段,而框架將其關聯到了 Request 對象上,所以也可以下面這樣鏈式調用:Request::route()->
  • 3分鐘短文|Laravel 靈活地獲取當前請求的路由地址
    學習時間在 Laravel 4 中你可以使用系統提供的 Route 對象,直接訪問其方法實現:Route::currentRouteName();雖然laravel做了很多努力向下兼容,但是隨著PHP的版本升級, 以及框架的改良,實現同一功能的方法也越來越靈活。
  • 3分鐘短文:刀刃向內,Laravel緩存測試簡單入門
    打開命令行工具,進入到laravel工作根目錄,運行命令:.最後驗證上傳是否成功。很多時候測試路由要求必須有真是的文件存在,比如對於用戶,我們要求其必須有一個頭像文件。 laravel使用了Faker庫用於偽數據的生成,我們通過一個工廠方法,實現為每個用戶創建頭像的需求。
  • 3分鐘短文 | Laravel 給所有視圖追加公共數據
    引言這又是一個深入laravel運行方式的問題,面對數百張頁面,不可能所有的簡單的頁面 複雜的頁面都繼承了某些公用的layout數據。那麼如何做到給所有視圖都追加公共數據呢? 本文就來說一說。代碼像下面這樣:View::share(&39;, [1, 2, 3]);如果僅是指定控制器,或者路由的頁面才會追加公用數據,可以在聲明控制器的基類, 並在基類內注入公用數據。