本系列文章已集結成冊與鐵人賽文章差異內容,有以下幾點:
更新至Laravel 8、基礎的PHP重點筆記、加強製作API流程細節、加入程式設計模式,優化、重構程式碼的部分,並且於書籍前面的章節介紹Git。
讓您從製作第一個簡單的API到優化自己的程式碼,分享我的經驗給您,打造自己的最強大腦API,若有興趣的朋友可以參考看看
此篇文章同步發表於個人部落格
新增(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 欄位的值輸入錯誤格式,雖然有正確回傳資料錯誤的訊息,不過是英文的敘述!
再專案中找到下方路徑,並搜尋三個 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更好,在不正確得請求資料時,回傳錯誤訊息。
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);
}
}
你好,感謝你的回覆,也有找到另外一種表單驗證的解決辦法!
剛剛嘗試了一下 Laravel 7.12.0 可以使用,可能我沒有標註清楚需要在 Headers 要加上 Accept:application/json 的標頭才可以正常運行,否則表單驗證沒有通過會直接跳回首頁,確實是發生這件事。
大大好
我想請問大大
$this->validate($request,[])
$request->validate([])
//是否等價
st474ddr您好!我記得這兩個寫法是一樣的效果!
感謝大大回覆