iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
1
Modern Web

使用 Laravel 打造 RESTful API系列 第 13

驗證資料格式、設定系統語系

使用Laravel 8 PHP主流框架打造RESTful API(iT邦幫忙鐵人賽系列書)ISBN:9789864345304

本系列文章已集結成冊與鐵人賽文章差異內容,有以下幾點:

更新至Laravel 8、基礎的PHP重點筆記、加強製作API流程細節、加入程式設計模式,優化、重構程式碼的部分,並且於書籍前面的章節介紹Git。

讓您從製作第一個簡單的API到優化自己的程式碼,分享我的經驗給您,打造自己的最強大腦API,若有興趣的朋友可以參考看看

天瓏網路書局:
https://www.tenlong.com.tw/products/9789864345304


此篇文章同步發表於個人部落格


新增(C) 查詢(R) 修改(U) 刪除(D) 都完成了!

但應該會發現一件事情,再新增以及修改的形況下,會有一點錯誤!

可以先嘗試看看

POST /api/animal

Headers 一樣給 json 格式回傳,但Body 裡面不要給任何值!

應該會出現錯誤!表示後端程式想要嘗試寫入不符合規定的值到資料表中!

所以需要做後端的表單檢查,Laravel 有一套驗證系統,設定的規則可以看官網文件

AnimalController 中的 store 方法裡一開頭加入

public function store(Request $request)
{
    $this->validate($request, [
        'type_id' => 'required',
        'name' => 'required|max:255',
        'birthday' => 'required|date',
        'area' => 'required|max:255',
        'fix' => 'required|boolean',
        'description' => 'nullable',
        'personality' => 'nullable'
    ]);

    //其他原本的程式略過
}
規格變數 說明
required 必填欄位
nullable 非必填欄位
max:255 最大255值
date 檢查是否為日期格式,利用 PHP strtotime 函數檢查字段
boolean 只能輸入 true false 1 0 "1" "0"

其他請參考

https://laravel.com/docs/5.8/validation#available-validation-rules


驗證失敗回傳結果

錯誤訊息

什麼是英文的!我故意把 birthday 、fix 欄位的值輸入錯誤格式,雖然有正確回傳資料錯誤的訊息,不過是英文的敘述!

修改預設Laravel系統語系

再專案中找到下方路徑,並搜尋三個 key locale、fallback_locale、faker_locale 修改為繁體中文。

/animal/config/app.php

//略過其他程式碼
'locale' => 'zh-Hant-TW', //系統預設語系
//略過其他程式碼
'fallback_locale' => 'zh-Hant-TW', //如果使用者設定,系統並沒有該語系,會使用這個邊設定的值
//略過其他程式碼
'faker_locale' => 'zh_TW', //生成假資料的語系格式

修改如上3個值!下載繁體中文語言包,可以參考下面的 GitHub 網址:

https://github.com/caouecs/Laravel-lang

裡面已經有好心人士翻譯各種語言

把它下載回來 src 資料夾裡面有各式各樣的翻譯,把 zh-TW 資料夾複製到的 animal/resources/lang 的資料夾中,剛剛我設定 zh-Hant-TW 所以也把資料夾重新命名 zh-TW -> zh-Hant-TW

再重新送一次請求,驗證的錯誤訊息就會變中文的囉!

中文驗證錯誤訊息

如果還是英文的!執行下方指令清除config快取試試看,應該就可以正常運作!

php artisan config:cache

可以看到 birthday 、fix 是英文的,我們自己來修改一下語言包

animal/resources/lang/zh-Hant-TW/validation.php

'attributes' => [
    ...
    'birthday'              => '生日',
    'fix'                   => '結紮紀錄',
]

修改變數為中文名稱

修改功能(Update) 也是一樣的步驟,可以讓API更好,在不正確得請求資料時,回傳錯誤訊息。


上一篇
動物排序
下一篇
分類CRUD、模型關聯
系列文
使用 Laravel 打造 RESTful API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
a600masool
iT邦新手 5 級 ‧ 2020-05-22 15:58:03

laravel 7 如果用上面提到的驗證作法會一直被導回首頁
查了很久,最後照著官網提供的方法才成功取得錯誤訊息,提供給大家

use Illuminate\Support\Facades\Validator;
public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'type_id' => 'required',
            'name' => 'required|max:255',
            'birthday' => 'required|date',
            'area' => 'required|max:255',
            'fix' => 'required|boolean',
            'description' => 'nullable',
            'personality' => 'nullable'
        ]);

        if ($validator->fails()) {
            return $validator->errors();
        } else {
            $animal = Animal::create($request->all());
            return response($animal, Response::HTTP_CREATED);
        }
    }
Victor iT邦新手 2 級 ‧ 2020-06-03 17:05:06 檢舉

你好,感謝你的回覆,也有找到另外一種表單驗證的解決辦法!/images/emoticon/emoticon12.gif
剛剛嘗試了一下 Laravel 7.12.0 可以使用,可能我沒有標註清楚需要在 Headers 要加上 Accept:application/json 的標頭才可以正常運行,否則表單驗證沒有通過會直接跳回首頁,確實是發生這件事。

0
st474ddr
iT邦新手 2 級 ‧ 2021-01-26 17:38:56

大大好
我想請問大大

$this->validate($request,[])
$request->validate([])
//是否等價
Victor iT邦新手 2 級 ‧ 2021-01-31 14:54:20 檢舉

st474ddr您好!我記得這兩個寫法是一樣的效果!

st474ddr iT邦新手 2 級 ‧ 2021-02-01 15:43:01 檢舉

感謝大大回覆

我要留言

立即登入留言