Pada tutorial ini, kita akan membahas bagaimana membangun sebuah REST API menggunakan framework Laravel yang merupakan salah satu framework PHP yang populer dan banyak digunakan. REST API sangat berguna untuk membangun aplikasi yang dapat berinteraksi dengan platform lain seperti aplikasi mobile atau layanan front-end yang terpisah.
Table of contents
Open Table of contents
Membuat Proyek Laravel Baru
Sebelum kita memulai, pastikan bahwa Anda telah menginstall PHP, Composer, dan Laravel pada sistem Anda. Jika Anda belum menginstallnya, Anda bisa mengikuti panduan instalasi resmi dari Laravel. Kita juga bisa menggunakan Docker untuk menginstall Laravel dengan mudah. Caranya, jalankan perintah dibawah ini:
docker run --rm \
--pull=always \
-v "$(pwd)":/opt \
-w /opt \
-it ramageek/php:beta-8.1-sprint-laravel \
bash -c "laravel new laravel-rest-api"
Command diatas kita akan menjalan sebuah container Docker yang akan menginstall Laravel dengan Laravel Installer pada direktori laravel-rest-api
yang ada di direktori kerja saat ini. Pada prosesnya, kita akan ditanyakan mengenai setup yang akan digunakan. Berikut ini adalah contoh setup yang saya gunakan:
Selanjutnya, kita akan membuat database yang khusus untuk keperluan testing. Buat berkas di folder database dengan nama create-testing-database.sh
dan isi dengan kode berikut:
#!/usr/bin/env bash
mysql --user=root --password="$MYSQL_ROOT_PASSWORD" <<-EOSQL
CREATE DATABASE IF NOT EXISTS testing;
GRANT ALL PRIVILEGES ON \`testing%\`.* TO '$MYSQL_USER'@'%';
EOSQL
Kita buat sebuah file bernama docker-compose.yml
dengan isi sebagai berikut:
services:
php:
image: ramageek/php:beta-8.1-sprint
ports:
- "${APP_PORT:-8000}:80"
volumes:
- ".:/var/www/html"
networks:
- laravel-rest-api
depends_on:
- mariadb
mariadb:
image: "mariadb:10"
ports:
- "${FORWARD_DB_PORT:-3306}:3306"
environment:
MYSQL_ROOT_PASSWORD: "${DB_PASSWORD}"
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: "${DB_DATABASE}"
MYSQL_USER: "${DB_USERNAME}"
MYSQL_PASSWORD: "${DB_PASSWORD}"
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
# mapping ke direktori storage/app/mariadb agar database tidak hilang saat container dihapus
- "./storage/app/mariadb:/var/lib/mysql"
# mapping ke berkas create-testing-database.sh agar database testing dapat dibuat saat container pertama kali dijalankan
- "./database/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh"
networks:
- laravel-rest-api
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s
networks:
laravel-rest-api:
driver: bridge
Konfigurasi Database
Edit file .env
pada root proyek untuk mengatur database Anda:
DB_CONNECTION=mysql
DB_HOST=mariadb # host dbms dari salah satu services dalam docker-compose
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret
Sampai tahap ini, kita sudah memiliki proyek Laravel yang siap untuk digunakan.
Masuk ke Dalam Server Proyek
Masuk ke dalam server proyek dengan menjalankan perintah berikut:
docker-compose exec php bash
Mulai saat ini, kita akan menggunakan perintah-perintah composer dan juga artisan untuk mengatur proyek Laravel di dalam server yang telah kita buat berdasarkan berkas docker-compose.yml
yang telah kita buat sebelumnya.
Membuat Model dan Migration
Buat model beserta migration untuk database menggunakan artisan command:
php artisan make:model Product -m
Lalu, definisikan struktur tabel dalam migration file yang dibuat di direktori database/migrations
. Contohnya:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->ulid('id')->primary();
$table->string('name');
$table->string('photo')->nullable();
$table->string('model');
$table->decimal('price', 10, 2);
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('products');
}
};
Sesuaikan juga class Product
yang ada di direktori app/Models
dengan kode berikut:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Concerns\HasUlids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Product extends Model
{
use HasFactory, HasUlids, SoftDeletes;
protected $fillable = ['name', 'model', 'photo', 'price'];
}
Instalasi Package Laravel Data
Laravel Data adalah sebuah package yang dibuat oleh Spatie yang berfungsi untuk mempermudah kita dalam mengatur data objek pada aplikasi Laravel. Untuk menginstallnya, jalankan perintah berikut:
composer require spatie/laravel-data
Dengan package ini membuat lebih mudah untuk menciptakan objek data yang kaya dan bisa digunakan dalam banyak cara. Sehingga, kita hanya perlu menjelaskan data kamu sekali saja, misalnya:
- Daripada membuat permintaan formulir, kamu bisa menggunakan objek data.
- Daripada menggunakan pengubah API, kamu juga bisa menggunakan objek data.
- Dan daripada menulis definisi TypeScript secara manual, yang kamu perlukan hanyalah… 🥁 sebuah objek data.
Membuat Objek Data untuk Product
Buat sebuah file di direktori app/Data
dengan nama ProductData.php
dan isi dengan kode berikut:
<?php
namespace App\Data;
use Illuminate\Support\Carbon;
class ProductData extends \Spatie\LaravelData\Data
{
public function __construct(
public ?string $id,
public string $name,
public ?string $photo,
public string $model,
public float $price,
public ?Carbon $created_at,
public ?Carbon $updated_at,
public ?Carbon $deleted_at,
) {
}
}
Membuat Resource Controller
Untuk membuat REST API, kita perlu membuat controller yang akan menangani permintaan API. Gunakan artisan command untuk membuat controller:
php artisan make:controller Api/ProductController -m Product
Karena kita akan membuat API, ada 2 method yang tidak kita perlukan pada Controller ini, yaitu create
dan edit
. Kita bisa menghapusnya dari class ProductController
yang telah dibuat. Sehingga, class ProductController
akan memiliki 5 method tersisa, yakni index
, show
, store
, update
, dan destroy
.
Disinilah kita akan menggunakan data objek ProductData
. Data ini akan menggantikan beberapa class lain yang biasanya digunakan untuk mengatur data seperti Request
dan Resource
. Caranya:
- Hapus baris
use Illuminate\Http\Request;
- Gantikan parameter pertama pada method
store
danupdate
denganProductData $request
Hasil akhirnya, class ProductController
akan terlihat seperti ini:
<?php
namespace App\Http\Controllers\Api;
use App\Data\ProductData;
use App\Http\Controllers\Controller;
use App\Models\Product;
class ProductController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(ProductData $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(Product $product)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(ProductData $request, Product $product)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Product $product)
{
//
}
}
Membangun Fungsi Controller
Tuliskan fungsi-fungsi yang akan menangani operasi CRUD pada ProductController
.
/**
* Display a listing of the resource.
*/
public function index()
{
return ProductData::collection(Product::query()->paginate());
}
/**
* Store a newly created resource in storage.
*/
public function store(ProductData $request)
{
$attributes = $request->toArray();
$data = Product::query()->create($attributes);
return ProductData::from($data);
}
/**
* Display the specified resource.
*/
public function show(Product $product)
{
return ProductData::from($product);
}
/**
* Update the specified resource in storage.
*/
public function update(ProductData $request, Product $product)
{
$attributes = $request->only('name', 'photo', 'model', 'price')->toArray();
$product->update($attributes);
return response()->noContent();
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Product $product)
{
$product->delete();
return response()->noContent();
}
Mendefinisikan Route
Tambahkan route untuk API di dalam file routes/api.php
:
Route::apiResource('products', \App\Http\Controllers\Api\ProductController::class)
->except(['create', 'edit']);
Validasi route yang telah kita buat dengan menjalankan perintah berikut:
php artisan route:list
Menguji API
Gunakan Postman atau alat uji coba API lainnya untuk menguji fungsi-fungsi API yang telah Anda buat. Pastikan bahwa endpoints bekerja sesuai kebutuhan CRUD.
Penutup
Sekarang Anda sudah memiliki REST API untuk product yang berfungsi dengan Laravel. Selanjutnya, kita akan membahas bagaimana cara meningkatkan developer experience agar lebih mudah dalam mengatur API yang telah kita buat dan juga menerapkan best practice dalam membangun REST API.
Semoga tutorial singkat ini bermanfaat dan memberi Anda dasar yang kuat dalam membangun REST API menggunakan Laravel. Selamat coding!