Implementasi Request Validation di Laravel REST API

Implementasi Request Validation di Laravel REST API

id7 min read • 3892 views

Form Request Validation - Laravel adalah salah satu framework PHP paling populer yang digunakan untuk pengembangan web. Salah satu fitur hebat yang ditawarkan oleh Laravel adalah Form Request Validation, yang memungkinkan pengembang untuk memvalidasi data yang dikirim oleh user sebelum data tersebut diproses lebih lanjut. Dalam artikel ini, kita akan membahas tentang implementasi Form Request Validation di REST API Laravel dan bagaimana fitur ini dapat membantu meningkatkan keamanan dan kualitas aplikasi.

Mengapa Validasi Penting?

Validasi merupakan bagian penting dari setiap aplikasi. Melalui validasi ini, kita dapat memastikan bahwa data yang masuk ke dalam sistem sesuai dengan rule dan persyaratan yang telah ditentukan. Validasi membantu mencegah data yang tidak valid atau berbahaya masuk ke dalam basis data, sehingga mengurangi kemungkinan terjadinya serangan seperti SQL injection, Cross-Site Scripting (XSS), dan sebagainya. Dengan menggunakan Form Request Validation di Laravel, kita dapat dengan mudah mengimplementasikan validasi yang powerfull dan terpusat pada setiap request yang masuk.

Step 1: Generate PostRequest

Untuk mengimplementasikan Form Request Validation di Laravel, langkah pertama yang harus kita lakukan adalah membuat Form Request Class. Form Request Class adalah class  yang akan memvalidasi data yang dikirim dari form sebelum memprosesnya di Controller.

Kita dapat menggunakan perintah artisan untuk membuat Form Request Class:

php artisan make:request PostRequest

Setelah perintah di atas dijalankan, Laravel akan membuatkan class baru dalam direktori app/Http/Requests. Kita bisa melihat file PostRequest.php yang baru saja dibuat dan mengeditnya sesuai dengan kebutuhan validasi Kita.

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

class PostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'title'   => 'required|min:3|max:255',
            'content' => 'required|min:3',
            'cover'   => 'image|mimes:jpg,jpeg,png|max:2048'
        ];
    }

    public function messages(): array
    {
        return [
            'title.required'   => 'Title is required',
            'title.min'        => 'Title must be at least 3 characters',
            'title.max'        => 'Title may not be greater than 255 characters',
            'content.required' => 'Content is required',
            'content.min'      => 'Content must be at least 3 characters',
            'cover.image'      => 'Cover must be an image',
            'cover.mimes'      => 'Cover must be a file of type: jpg, jpeg, png',
            'cover.max'        => 'Cover may not be greater than 2048 kilobytes'
        ];
    }

    public function failedValidation(Validator $validator)
    {
        throw new HttpResponseException(response()->json([
            'success' => false,
            'message' => 'Validation errors',
            'data'    => $validator->errors()
        ], 422));
    }
}

Berikut ini adalah pembahasan dari kode di atas.

Menentukan Rules

Setelah kita memiliki Form Request Class, langkah selanjutnya adalah menentukan rule validasi dalam method rules(). Di dalam method ini, Kita dapat menentukan berbagai validation rules untuk setiap field pada formulir. Misalnya, Kita dapat menentukan bahwa suatu field harus wajib diisi, harus berupa angka, memiliki panjang maksimum atau minimum tertentu, dan sebagainya.

Contoh validation rules untuk Form Request Class yang memvalidasi data create atau update post dapat terlihat seperti berikut:

public function rules(): array
{
    return [
        'title'   => 'required|min:3|max:255',
        'content' => 'required|min:3',
        'cover'   => 'image|mimes:jpg,jpeg,png|max:2048'
    ];
}

Pada contoh di atas, validation rules untuk field title adalah wajib diisi, minimal 3 karakter dan maksimal 255 karakter. Field content harus diisi dan minimal 3 karakter. Dan field cover harus image dengan ekstensi file jpg, jpeg, png dan maksimal berukuran 2048 kb.

Custom Error Messages

Setelah kita menentukan validation rules, kita juga dapat mendifinisakan error message dari rule yang telah ditentukan. Contoh bagaimana cara mengatur error message, bisa dilihat seperti contoh di bawah ini.

public function messages(): array
{
    return [
        'title.required'   => 'Title is required',
        'title.min'        => 'Title must be at least 3 characters',
        'title.max'        => 'Title may not be greater than 255 characters',
        'content.required' => 'Content is required',
        'content.min'      => 'Content must be at least 3 characters',
        'cover.image'      => 'Cover must be an image',
        'cover.mimes'      => 'Cover must be a file of type: jpg, jpeg, png',
        'cover.max'        => 'Cover may not be greater than 2048 kilobytes'
    ];
}

Menangani Hasil Validasi

Setelah validation rules didefinisikan dalam Form Request Class, mari kita buat function yang berfungsi untuk menangani API return ketika request gagal divalidasi. 

public function failedValidation(Validator $validator)
{
    throw new HttpResponseException(response()->json([
        'success' => false,
        'message' => 'Validation errors',
        'data'    => $validator->errors()
    ], 422));
}

Jadi, function failedValidation ini akan dijalankan ketika request gagal divalidasi dan me-return error message seperti di bawah ini.

{
    "success": false,
    "message": "Validation errors",
    "data": {
        "title": [
            "Title is required"
        ],
        "content": [
            "Content is required"
        ],
        "cover": [
            "Cover may not be greater than 2048 kilobytes"
        ]
    }
}

Step 2: Update Controller

Oke, setelah kita memiliki Form Request Validation, berikutnya kita bisa update PostController.

Import class PostRequest pada PostController.

use App\Http\Requests\PostRequest;

Update method store

Berikutnya, kita update method store, yang awalnya seperti di bawah ini.

public function store(Request $request){

update menjadi seperti di bawah ini.

public function store(PostRequest $request){

Kemudian kita kita bisa hapus manual validation pada method tersebut.

$validator = Validator::make($request->all(), [
    'title'   => 'required|string|max:255',
    'content' => 'required|string',
]);

if ($validator->fails()) {
    return response()->json([
        'message' => 'Validation errors',
        'errors' => $validator->errors()
    ], 422);
}

Update method update

Lakukan hal yang sama pada method update seperti pada method store.

public function update(Request $request, $id){

Ubah menjadi seperti di bawah ini.

public function update(PostRequest $request, $id){

Kemudian, hapus juga manual validation pada method update.

$validator = Validator::make($request->all(), [
    'title'   => 'required|string|max:255',
    'content' => 'required|string',
]);

if ($validator->fails()) {
    return response()->json([
        'message' => 'Validation errors',
        'errors' => $validator->errors()
    ], 422);
}

Kesimpulan

Dengan menggunakan Form Request Validation di Laravel, Kita dapat dengan mudah menerapkan validasi form yang powerfull dan terpusat. Hal ini membantu meningkatkan keamanan aplikasi kita dengan mencegah data yang tidak valid atau berbahaya masuk ke dalam sistem. Selain itu, Form Request Validation juga membantu meningkatkan kualitas kode dengan memisahkan logika validasi dari Controller, sehingga kode menjadi lebih terstruktur dan mudah dikelola.

Jadi, pastikan untuk selalu menerapkan Form Request Validation di setiap form dalam aplikasi Laravel untuk menciptakan aplikasi yang aman, handal, dan berkualitas tinggi.

Series: Laravel 10 Rest API using Sanctum
Published on July 30, 2023
Last updated on April 20, 2025

If you like this post and want to support us, you can support us via buymeacoffee or trakteer.