iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
Software Development

全端開發包括測試自己一條龍!系列 第 8

Day 8 - Laravel Request validation

Introduce

由於我們想防範使用我們API的使用者傳入惡意的參數或傳入我們預期中型態的參數,我們需要做好Request validation的防護

  1. 建立Request,把Request獨立出來不要在Controller當中做Validation
$ sail artisan make:request CreatePostRequest
  1. 指定Call create post API的時候進行Validation,我們只要在Controller自動注入CreatePostRequest
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\PostService;
use App\Http\Requests\CreatePostRequest;
use Illuminate\Http\JsonResponse;

class PostController extends Controller
{
    protected $service;

    public function __construct(PostService $service)
    {
        $this->service = $service;
    }

    /**
     * 建立文章
     * @param CreatePostRequest $request
     * @return JsonResponse
     */
    public function create(CreatePostRequest $request): JsonResponse
    {
        $result = $this->service->create($request->all());
        return response()->json($result);
    }
}
  1. 調整CreatePostRequest
    • authorize()裡面調整為true
    • rules()當中驗證傳入的Request
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CreatePostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'title' => 'required|string|unique:posts',
            'content' => 'required|string',
        ];
    }
}
  1. 當我們傳入空的body時,Status code會直接回傳422,並顯示哪些欄位為必填,或須為字串;另外如果傳入的Title已經建立過,將會跳出已經該Title已經建立過的錯誤訊息

  2. 接下來列出幾個比較常見的Validation供參考

required可以替換為:

  • filled: 此參數可傳可以不傳,傳入時必須不為空值.
  • present: 此參數必填,但可以為空值.

其它:

  • max or min: 限制最大或最小的長度
return [
    'title' => 'required|string|unique:posts|max:10|min:2',
];
  • exists: 該欄位參數必須已經存在在資料庫
return [
    'user_id' => 'required|integer|exists:user_id',
];
  • rule: 白名單,傳入字串必須為陣列當中其中一個,範例:排序必須為升冪或降冪
return [
    'sort' => [
        'required',
        'string',
        Rule::in(['asc', 'desc'])
    ],
];
return [
    'sort' => [
        'required|string|in:asc,desc',
    ],
];
  • after: 結束時間必須在開始時間後面
return [
    'start_at' => [
        'required',
        'date'
    ],
    'end_at' => [
        'required',
        'date',
        'after:start_at'
    ],
]
  • email: 驗證字串為Email
'email' => 'email:rfc,dns'

上一篇
Day 7 - 淺談Laravel資料庫關聯的運用
下一篇
Day 9 - Laravel 8.0的Error Handling
系列文
全端開發包括測試自己一條龍!10

尚未有邦友留言

立即登入留言