Laravel adalah framework PHP yang kuat dan fleksibel, menjadikannya pilihan terbaik untuk membangun aplikasi seperti sistem chat multi-user. Dalam tutorial ini, Anda akan mempelajari cara membuat RESTful API untuk mendukung fitur chat multi-user menggunakan Laravel.

1. Persiapan Awal

Langkah pertama adalah memastikan Laravel terinstal di sistem Anda. Jika belum, instal Laravel menggunakan Composer:

composer create-project –prefer-dist laravel/laravel chat-api
cd chat-api
php artisan serve

Laravel akan berjalan di server lokal. Selanjutnya, kita mulai membangun API chat multi-user.

2. Struktur Database

Sistem chat multi-user memerlukan tabel berikut:

  1. Users: Menyimpan informasi pengguna.
  2. Messages: Menyimpan pesan chat.
  3. Chat Rooms (opsional): Jika sistem mendukung chat dalam grup.

Membuat Model dan Migrasi

Gunakan perintah berikut untuk membuat model dan migrasi:

php artisan make:model User -m
php artisan make:model Message -m
php artisan make:model ChatRoom -m

Kemudian, edit file migrasi:

  • Tabel users (bawaan Laravel, hanya tambahkan kolom jika perlu):

Schema::create(‘users’, function (Blueprint $table) {
$table->id();
$table->string(‘name’);
$table->string(’email’)->unique();
$table->timestamp(’email_verified_at’)->nullable();
$table->string(‘password’);
$table->timestamps();
});

Tabel messages

Schema::create(‘messages’, function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger(‘sender_id’);
$table->unsignedBigInteger(‘receiver_id’)->nullable(); // Untuk pesan langsung
$table->unsignedBigInteger(‘chat_room_id’)->nullable(); // Untuk pesan grup
$table->text(‘message’);
$table->timestamps();

$table->foreign(‘sender_id’)->references(‘id’)->on(‘users’)->onDelete(‘cascade’);
$table->foreign(‘receiver_id’)->references(‘id’)->on(‘users’)->onDelete(‘cascade’);
$table->foreign(‘chat_room_id’)->references(‘id’)->on(‘chat_rooms’)->onDelete(‘cascade’);
});

Tabel chat_rooms:

Schema::create(‘chat_rooms’, function (Blueprint $table) {
$table->id();
$table->string(‘name’);
$table->timestamps();
});

Jalankan migrasi:

php artisan migrate

3. Membuat API Endpoint

Buka file routes/api.php dan tambahkan route berikut:

User Authentication

Tambahkan endpoint untuk registrasi dan login:

use App\Http\Controllers\UserController;

Route::post(‘/register’, [UserController::class, ‘register’]);
Route::post(‘/login’, [UserController::class, ‘login’]);

Pesan

Tambahkan endpoint untuk mengirim dan mengambil pesan:

use App\Http\Controllers\MessageController;

Route::middleware(‘auth:sanctum’)->group(function () {
Route::get(‘/messages’, [MessageController::class, ‘index’]); // Ambil semua pesan
Route::post(‘/messages’, [MessageController::class, ‘store’]); // Kirim pesan
});

Chat Room (opsional)

Jika mendukung grup chat:

use App\Http\Controllers\ChatRoomController;

Route::middleware(‘auth:sanctum’)->group(function () {
Route::get(‘/chat-rooms’, [ChatRoomController::class, ‘index’]);
Route::post(‘/chat-rooms’, [ChatRoomController::class, ‘store’]);
});

4. Membuat Controller

UserController

Tambahkan logika registrasi dan login:

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class UserController extends Controller
{
public function register(Request $request)
{
$user = User::create([
‘name’ => $request->name,
’email’ => $request->email,
‘password’ => Hash::make($request->password),
]);
return response()->json($user, 201);
}

public function login(Request $request)
{
$user = User::where(’email’, $request->email)->first();
if ($user && Hash::check($request->password, $user->password)) {
$token = $user->createToken(‘chat-api-token’)->plainTextToken;
return response()->json([‘token’ => $token], 200);
}
return response()->json([‘error’ => ‘Invalid credentials’], 401);
}
}

MessageController

Tambahkan logika untuk pesan:

namespace App\Http\Controllers;

use App\Models\Message;
use Illuminate\Http\Request;

class MessageController extends Controller
{
public function index(Request $request)
{
$messages = Message::where(‘receiver_id’, $request->user()->id)
->orWhere(‘sender_id’, $request->user()->id)
->get();
return response()->json($messages);
}

public function store(Request $request)
{
$message = Message::create([
‘sender_id’ => $request->user()->id,
‘receiver_id’ => $request->receiver_id,
‘message’ => $request->message,
]);
return response()->json($message, 201);
}
}

buatkan ChatRoomController:

namespace App\Http\Controllers;

use App\Models\ChatRoom;
use Illuminate\Http\Request;

class ChatRoomController extends Controller
{
public function index()
{
return response()->json(ChatRoom::all());
}

public function store(Request $request)
{
$chatRoom = ChatRoom::create($request->all());
return response()->json($chatRoom, 201);
}
}

 

5. Pengujian API

Gunakan Postman atau cURL untuk menguji endpoint. Berikut contoh:

  • POST /register: Daftarkan pengguna.
  • POST /login: Login dan dapatkan token.
  • GET /messages: Ambil semua pesan.
  • POST /messages: Kirim pesan baru.
6. Keamanan API

Gunakan Laravel Sanctum untuk autentikasi berbasis token. Instal dan konfigurasikan Sanctum:

composer require laravel/sanctum
php artisan vendor:publish –provider=”Laravel\Sanctum\SanctumServiceProvider”
php artisan migrate

use App\Http\Controllers\MessageController;

Route::middleware(‘auth:sanctum’)->group(function () {
Route::get(‘/messages’, [MessageController::class, ‘index’]); // Ambil semua pesan
Route::post(‘/messages’, [MessageController::class, ‘store’]); // Kirim pesan
Route::delete(‘/messages/{id}’, [MessageController::class, ‘destroy’]); // Hapus pesan
});

 

use App\Http\Controllers\MessageController;
use App\Http\Controllers\AuthController;

Route::post(‘/login’, [AuthController::class, ‘login’]);

Route::middleware(‘auth:sanctum’)->group(function () {
Route::get(‘/messages’, [MessageController::class, ‘index’]);
Route::post(‘/messages’, [MessageController::class, ‘store’]);
Route::delete(‘/messages/{id}’, [MessageController::class, ‘destroy’]);
});