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:
- Users: Menyimpan informasi pengguna.
- Messages: Menyimpan pesan chat.
- 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 migrateuse 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’]);
});