[laiUanKe] 這是誰發的文?middleware驗證

上次做好了留言板,這次我們增加一個名稱顯示
留言板要顯示是誰貼的文


為了簡化流程我們不建立會員註冊的表單
而是在文章新增一個作者欄位
進入網站要輸入使用者名稱,存入 session
用 middleware 判斷 session 是否存在,不存在則導回輸入頁面
所以先去改之前的 migrate 檔案

middleware

先新建一個 middleware 吧
php artisan make:middleware {name}

再來註冊進 /app/Http/Kernel.php

因為我們每一頁都要判斷用戶有沒有設定 username
所以設定在 $middleware 內
如果是很多個 middleware 要一起引入,可以設定一個 $middlewareGroups
而 $middlewareGroups['web'] 是預設會引入的
至於個別頁面才用到的 middleware 可以設定在 $routeMiddleware
在路由裡面設定

然後我們就踩到雷了
$middleware 是每一頁都會做的預處理
今天目標是,如果沒有設定 username 要跳到設定頁面
如果做在這邊,連設定 username 也會被影響
造成無限跳轉問題!
所以我們應該加在 $routeMiddleware 中,個別去引用
或是用路由群組一次引用
先來改一下 middleware註冊位置

比較一下你自己的檔案
可以看到我們把剛剛新增的 middleware ,命名為 username

再就是路由,看看說的 路由群組 怎麼用

用一個 Route::group 定義給他 middleware 然後包在 function 裡面
如此就會在進入這底下這些 Route 的時候使用叫做 username 的 middleware 檢查

弄了半天我們還沒開始設定 mIddleware 條件
開啟剛剛建立的 VerifyUser.php 這隻 middleware 檔案
當進入驗證時候,去判斷有沒有設定名稱的 session
沒有的話就跳轉回設定頁面,我是設定首頁是設定頁面
長個像這樣

先用 Laravel 定義的方式取得名為 username 的 session
預設值是 NULL 如果取回來的 username 為空
那就導向設定使用者名稱頁面 (首頁)
否則,把回傳值帶入傳送到 controller 繼續執行路由

再來就是要找地方設定 username 的 session 啦
新建一個頁面來輸入表單,然後設定路由顯示輸入頁面和送出後接收的方法
還要有 controller 處理這一段,在 userController 中
把 store 方法拿來處理寫入 session
一樣用 Laravel 內建的 session 方法,完成後導向文章頁面

只是必須在程式最上方加入這行,來宣告使用 Session 方法
use Illuminate\Support\Facades\Session;

否則 Laravel 會報錯,說無法存取 Session 這個 class

做到這邊就差不多完成了,已經可以設定 username 並且寫入 session
如果沒有設定就想查看留言,則會導向設定頁面

接下來就可以在資料表上動手腳,加入個別文章的 username 欄位
然後把取得的 username 給顯示在頁面上,然後寫入文章
這樣每一篇文章都可以知道是誰發表的
所以我們只需要在寫入時加入
$username = \request()->get('username');
就可以取得目前 session 中的 username 來寫入資料庫

最終頁面看起來就像這樣

花了比預期多很多的時間做這個東西
不過也藉此弄清楚蠻多東西的,還有就是對於整個規劃的流程比較熟悉了
接下來就是要做更深入的練習
像是真正的註冊,然後更新和刪除資料

留言