Cara Membuat REST API CRUD Dengan Laravel 8 Sanctum

Selamat malam para pembaca, pada artikel kali ini kita akan simulasikan membuat REST API CRUD data Program dengan Laravel 8. Misalnya kita mempunyai Aplikasi berbasis web dan kita ingin mengelola data program di web tersebut menggunakan REST API yang dibuat menggunakan Sanctum package pada Laravel 8. Oke para sobat cyber langsung saja ikuti langkah-langkah dibawah ini :

Langkah 1: Menambahkan Class Sanctum Middleware

\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,

Yang pertama harus sobat lakukan adalah menambahkan sanctum middleware ke api middleware group yang berada di dalam file app/Http/Kernel.php. Middleware ini bertugas untuk memastikan bahwa setiap request data yang masuk dapat di autentikasi dengan menggunakan cookie di laravel session, dan tetap akan mengizinkan permintaan dari pihak ketiga untuk dapat di autentikasi menggunakan API token.

Langkah 2: Create Model & Migration

php artisan make:model Program -m

Pada langkah yang kedua ini sobat perlu menambahkan dan membuat file model dan migration untuk menjalankan program. Selanjutkan jalankan perintah artisan seperti di atas untuk generate kedua file diatas yaitu model dan migration.

protected $guarded = [];

Setelah sobat berhasil generate file model, selanjutnya sobat buka file tersebut lalu tambahkan kode di atas.

public function up()
    {
        Schema::create('programs', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('desc');
            $table->timestamps();
        });
    }

Langkah berikutnya yang perlu sobat lakukan yaitu setup file migration Program yang telah sobat digenerate sebelumnya. Buka file tersebut pada direktori database/migrations/xxxx_xx_xx_xx_create_programs_table.php. Lalu pada method up, ubah kodenya menjadi seperti yang sudah dicontohkan di atas. Di file program migrations tersebut, sobat hanya menambahkan dua field yaitu name dan desc.

php artisan migrate

Jika sobat sudah menyelesaikan setup pada file migration, selanjutnya sobat jalankan perintah php artisan migrate untuk melakukan migrasi ke semua file migration kedalam database.

Langkah 3: Create API Resource

php artisan make:resource ProgramResource

Langkah selanjutnya untuk membuat atau megenerate resource class, sobat dapat gunakan perintah artisan make:resource seperti contoh di atas. Untuk defaultnya, resource akan ditempatkan pada direktori app/Http/Resources dari aplikasi atau laravel project yang sudah sobat buat. API resource akan extend Illuminate\Http\Resources\Json\JsonResource class.

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ProgramResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'desc' => $this->desc,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

Selanjutnya setelah berhasil generate file ProgramResource, sobat buka file tersebut kemudian ubah kode yang ada (tepatnya pada method toArray) menjadi seperti kode di atas. Pada setiap resource class akan mendefinisikan method toArray yang me-return attribute array yang harus diubah ke format JSON ketika resource dikembalikan sebagai response dari route atau controller. Sobat juga dapat mengakses model properties langsung dari variable $this. Karena resource class akan secara otomatis mem-proxy property dan akses method ke model untuk akses yang mudah. Selanjunya setelah resource didefinisikan, resource tersebut bisa direturn kembali dari route atau controller.

Langkah 4: Create Controller

php artisan make:controller API/ProgramController

Selain itu sobat juga perlu membuat controller baru untuk membuat logic dari CRUD dengan REST API Sanctum. Selanjuntnya jalankan perintah artisan seperti contoh di atas untuk membuat file ProgramController.php pada direktori app/Http/Controllers/API.

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Validator;
use App\Models\Program;
use App\Http\Resources\ProgramResource;

class ProgramController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $data = Program::latest()->get();
        return response()->json([ProgramResource::collection($data), 'Programs fetched.']);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(),[
            'name' => 'required|string|max:255',
            'desc' => 'required'
        ]);

        if($validator->fails()){
            return response()->json($validator->errors());       
        }

        $program = Program::create([
            'name' => $request->name,
            'desc' => $request->desc
         ]);
        
        return response()->json(['Program created successfully.', new ProgramResource($program)]);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $program = Program::find($id);
        if (is_null($program)) {
            return response()->json('Data not found', 404); 
        }
        return response()->json([new ProgramResource($program)]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Program $program)
    {
        $validator = Validator::make($request->all(),[
            'name' => 'required|string|max:255',
            'desc' => 'required'
        ]);

        if($validator->fails()){
            return response()->json($validator->errors());       
        }

        $program->name = $request->name;
        $program->desc = $request->desc;
        $program->save();
        
        return response()->json(['Program updated successfully.', new ProgramResource($program)]);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy(Program $program)
    {
        $program->delete();

        return response()->json('Program deleted successfully');
    }
}

Selanjunya setelah berhasil generate file ProgramController.php, sobat buka file controller tersebut kemudian ubah kode yang ada menjadi seperti contoh kode di atas. Pada file ProgramController.php ini, sobat perlu membuat method index, store, update, show dan destroy.

Penjelasan singkat dari contoh method diatas adalah:

Index, method yang digunakan untuk membuat logic menampilkan semua data dari table programs.
Store, method ini berfungsi menambahkan data dari request ke table programs. Pada method ini dilengkapi dengan data validation.
Show, method ini berfungsi untuk menampilkan detail data program berdasarkan id.
Update, method ini berfungsi untuk menerima data request dan memperbarui atau mengubah data program (berdasarkan id)  dan data request yang baru.
Delete, berfungsi untuk menghapus data program berdasarkan id data yang dikirimkan melalui parameter.

Langkah 5: Create REST API Routes

Route::resource('programs', App\Http\Controllers\API\ProgramController::class);

Pada langkah ini sobat perlu menambahkan route baru seperti contoh di atas agar CRUD program dengan REST API sanctum di laravel 8 dapat berjalan. Tambahkan kode tersebut pada  route::group yang telah diproteksi menggunakan middleware atau sejajar dengan Route::post(‘/logout’).

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

//API route for register new user
Route::post('/register', [App\Http\Controllers\API\AuthController::class, 'register']);
//API route for login user
Route::post('/login', [App\Http\Controllers\API\AuthController::class, 'login']);

//Protecting Routes
Route::group(['middleware' => ['auth:sanctum']], function () {
    Route::get('/profile', function(Request $request) {
        return auth()->user();
    });

    Route::resource('programs', App\Http\Controllers\API\ProgramController::class);

    // API route for logout user
    Route::post('/logout', [App\Http\Controllers\API\AuthController::class, 'logout']);
});

Ubah kode secara keseluruhan kode di routes/api.php sekarang menjadi seperti contoh di atas.

Langkah 6: Testing

Oke Sobat, selanjuntnya setelah sobat melalui langkah-langkah mulai dari menambahkan sanctum middleware hingga sampai di langkah 5 yaitu menambahkan REST API route, terakhir adalah waktunya untuk melakukan testing atau menguji REST API CRUD yang telah sobat buat dengan sanctum package di laravel 8. Di pengujian ini, sobat coba lakukan perintah create data, show data, update data, delete data dan menampilkan semua data dengan menggunakan software Postman.

Create Data dengan API

Testing yang pertama yaitu silahkan sobat lakukan create data atau menambahkan data dengan menggunakan Postman. Sebelum melakukannya, pastikan sobat sudah login dan mendapatkan token API nya. Kemudian pada langkah awal tadi, sobat set authorization token dengan membuka tab Authorization, lalu pilih type Bearer Token dan masukkan token yang didapatkan setelah login berhasil.

Jika authorization token sudah disetup, selanjutnya buat POST request ke 127.0.0.1:8000/api/programs, lalu kemudian pada body, sobat tambahkan key name dan desc beserta isi atau valuenya.

Jika sobat sudah menambahkan key dan value, selanjutnya klik button Send. Hasilny jika value yang diinputkan berhasil divalidasi dan data tersebut akan ditambahkan ke table programs pada database dan akan me-return response seperti contoh gambar di atas.

Fetch All Data

Selanjuntnya kita akan coba fetch all data atau menampilkan semua data di table. Untuk dapat melakukan pengujian tersebut, buat GET  dan request ke 127.0.0.1:8000/api/programs selanjuntnya klik button Send, hasil response yang ditampilkan akan seperti gambar di atas.

Get Single Data

Pada pengujian kali ini, kita akan test atau coba get single data atau menampilkan detail data program berdasarkan id. Agar sobat dapat melakukan pengetesan tersebut, buat GET request ke 127.0.0.1:8000/api/programs/{id}, kemudian klik button Send, hasil response yang ditampilkan akan seperti contoh gambar di atas atau akan menampilkan detail berdasarkan id data yang dipilih.

Update Data

Pada pengujian yang ke empat ini kita akan mencoba memperbarui data program atau update data berdasarkan id. Buat PUT dan request ke 127.0.0.1:8000/api/programs/{id}. Selanjutnya pada tab params, masukkan key dan value atau data yang akan menggantikan data yang ada (pada id data tersebut). Jika key dan value sudah di isi, selanjutnya klik button Send, maka response yang dihasilkan akan seperti contoh gambar di atas.

Delete Data

Testing yang terakhir yaitu kita akan mencoba menghapus data atau delete data menggunakn REST API sanctum di laravel 8. Agar sobat dapat melakukan delete data, buat DELETE request ke 127.0.0.1:8000/api/programs/{id} selanjutnya klik Send, hasilnya data dengan id tersebut akan dihapus dari table programs dan akan menampilkan response message seperti contoh gambar di atas.

Ok sobat, semoga artike ini bermanfaat. Jika ada kendala error silahkan ditanyakan pada komentar, terimkasih..

Leave a Reply

Your email address will not be published.