Laravel 學習筆記 — 專案練習 Part 4 — 錯誤處理
此篇主要針對錯誤訊息進行處理,或是在需要驗證的欄位出錯時,回饋錯誤訊息給使用者知道,錯在哪裡
現在我們試著在"新增文章"時,如果驗證到使用者輸入不合乎規則時,跳出錯誤提醒在"標題"上方
我們將判斷寫在 <form> 之前;判斷 $errors->any() (如果有任何錯誤的話)
就想顯示錯誤,至於錯誤內容是像一個陣列一樣的資訊,因此我們透過 foreach 將資料一筆一筆印出來
我們試試都不填寫任何內容,至接將表單送出,會出現的畫面如下
我們在 ArticlesController.php 寫入 stroe() 時,有設置 content 最少要10個字
接下來,我們應該針對,填寫正確的欄位,將已經填寫的值保留下來,要不然,每次有寫錯,就全部清掉重寫,會嚴重破壞使用者體驗
我們可以在 <input> 加上 value={{ old('title') }} 屬性,而 <textarea> 則是在內容加上 {{ old('content') }} 屬性
前一篇有提到,如果使用者沒有登入的話,新增文章,點下按鈕將表單送出
就會出錯(即使欄位填寫都符合 store() 內的規則也是),因此,正常流程應該要判斷使用者是否有登入,但是如果在 store() 裡面做判斷,這個 function 是已經在送出表單之後才執行的,因此我們應該在 App\Controllers\ArticlesController.php 內,一開始就做,有點像 class 的建構子一樣,在 __construct() 內掛上一個 叫 auth 的 middleware,$this->middleware('auth')
當這麼做之後,這整個 class 的行為都會被掛上這個 middleware,只要沒有登入,就會被踢去登入頁面;就算知道網址,直接輸入 http://localhost:8000/articles/create 也一樣會直接跳轉到 http://localhost:8000/login 頁面
以上的設定很好,確保要發表文章的使用者,必須要登入,但是如此一來,如果開啟無痕視窗的使用者,也許不想要發表文章,只是想瀏覽其他文章列表時,也會被迫要登入,才能到文章列表去,這種時候,怎麼辦呢?
這時候就需要:例外處理,我們可以使用 except('index') ,表示除了 index 的頁面(就是首頁)之外,其他的頁面才需要強制跳轉到登入頁面
最後,既然新增文章成功了,就來將已經寫到資料庫的文章以列表方式呈現吧
想要將資料庫的資料撈出來,呈現在網頁上,就必須先從 ArticlesController.php 將資料撈出來,再到 index.blade.php 呈現,因此我們先到 ArticlesController.php 的 index() 撈資料
在 views\articles\index.blade.php 用 foreach 將資料逐筆印出,先簡單印出看看
加上一點 class 調整文章列表的呈現,大致完成