Laravel Middleware

Laravel Middleware

更新於 發佈於 閱讀時間約 4 分鐘

Middleware(中介層),最常被應用在身分認證,比如我們可能開發了很多api,這些api都需要確認user有登入才能夠存取,這時候就很適合用middleware來處理,所有需要登入才能存取的api,request都先經過這個middleware來驗證,就不需要每個api最前面都要再寫一次一樣的身分驗證邏輯。


建立middleware指令:

$ php artisan make:middleware ${name}

假設建立一個Test middleware:

$ php artisan make:middleware Test
raw-image
  • 新增的middleware檔案會在app/Http/Middleware路徑中。

註冊Middleware:

在使用middleware之前,必須先註冊,在app/Http/Kernel.php這個路徑下,可以定義middleware的scope。

  1. Global Middleware:
raw-image
  • 這種用法是把Middleware定義為全域的,也就是所有的http request都會先經過這個Test Middleware。

2. Route Middleware

raw-image
  • 這種用法是Route Middleware,在routes中必須指定要使用什麼middleware,用法範例如下圖:
raw-image
  • route group用法如下:
raw-image
  • 也就是這個api url: http://xxx/api/article,都會執行test middleware。

3. Group Middleware

raw-image
  • 假設再新增一個Test2 middleware,可以在$middlewareGroups中新增一個群組middleware,這邊把Test, Test2這兩個middleware組合成test。
    這邊需特別注意,group中的middleware順序是有差的,會依序執行。
  • 在routes中使用這個group middleware的用法,跟上述的Route Middleware中講的一樣,這邊只是把多個middleware group成一個。
  • 如下圖,三個紅色區塊中的middleware寫法,意思是一樣的,都會執行test這個middleware:
raw-image

事實上Middleware還有分先執行還是後執行的,就只差在middleware的寫法,如下,這種寫法是會先執行middleware,再把request往後丟。

raw-image

下面這種寫法則是先把request往後丟執行,之後才執行middleware中的邏輯。

raw-image

簡單來說,假設為某個route api新增一個route middleware,第一種寫法會先執行middleware邏輯,後面才執行route後續的邏輯,第二種寫法則是會先執行route再執行middleware邏輯。


Middleware如何傳參:

raw-image
raw-image

若有傳參數的需求,用法如下:

${middleware_name}:${param1},${param2}
  • 冒號前是中介層名稱,冒號後是參數,多個參數by逗號分隔。
  • 如上範例,$param1=abc,$param2=123。



本筆記參考:

1. https://ithelp.ithome.com.tw/articles/10208371
2. https://medium.com/kidd88/laravel-middleware-66107ad44242
3. https://www.notes-hz.com/post/201






avatar-img
Vic Lin的沙龍
21會員
161內容數
留言
avatar-img
留言分享你的想法!
Vic Lin的沙龍 的其他內容
Laravel 提供了快速套用軟刪除的方法,直接在Model中加上use SoftDeletes即可: 接著在程式中,假設要把文章1刪除,可以直接這樣寫: 另外,如果我再執行一次上述的Article::find(1)->delete(); 會發現有error: 所以上述改成這樣:
如上篇,使用Migration來做DB版本控制,但是會發現開發過程中若是要建立測試資料,要進DB一筆一筆手動新增或執行預先寫好的insert sql,其實有點麻煩,使用Laravel提供的Seeder功能,就可以解決這個問題。 指令如下,假設建立一個user table seeder:
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
資料情境: 每個產品有多種顏色,每種顏色屬於一個產品(一對多)。 程式碼: Product Model: 本筆記參考: 1. https://stackoverflow.com/questions/40468976/inserting-with-relationships-in-laravel
安裝設置: 安裝完成後,專案目錄結構如下: 執行$ npm run dev 可直接透過http://localhost:3000進入首頁,對應到pages/index.js。 Prod記得每次要先build再start: Example: SSG: 透過外部api取得資料建立靜態頁面 結論:
Laravel Migrate可以用來做資料庫版本控制,對開發團隊來說,可以快速修改Schema,了解每個工程師做了什麼change,比如新增、修改哪些欄位、表格等等,是非常實用的功能。 在開始之前,須先建立好DB,並設定好.env中的DB連線config。 建立migrate指令:
Laravel 提供了快速套用軟刪除的方法,直接在Model中加上use SoftDeletes即可: 接著在程式中,假設要把文章1刪除,可以直接這樣寫: 另外,如果我再執行一次上述的Article::find(1)->delete(); 會發現有error: 所以上述改成這樣:
如上篇,使用Migration來做DB版本控制,但是會發現開發過程中若是要建立測試資料,要進DB一筆一筆手動新增或執行預先寫好的insert sql,其實有點麻煩,使用Laravel提供的Seeder功能,就可以解決這個問題。 指令如下,假設建立一個user table seeder:
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
資料情境: 每個產品有多種顏色,每種顏色屬於一個產品(一對多)。 程式碼: Product Model: 本筆記參考: 1. https://stackoverflow.com/questions/40468976/inserting-with-relationships-in-laravel
安裝設置: 安裝完成後,專案目錄結構如下: 執行$ npm run dev 可直接透過http://localhost:3000進入首頁,對應到pages/index.js。 Prod記得每次要先build再start: Example: SSG: 透過外部api取得資料建立靜態頁面 結論:
Laravel Migrate可以用來做資料庫版本控制,對開發團隊來說,可以快速修改Schema,了解每個工程師做了什麼change,比如新增、修改哪些欄位、表格等等,是非常實用的功能。 在開始之前,須先建立好DB,並設定好.env中的DB連線config。 建立migrate指令: