Sistem notifikasi adalah fitur penting dalam hampir setiap aplikasi web modern โ mulai dari pemberitahuan pesanan masuk, verifikasi email, hingga peringatan aktivitas akun. Laravel memiliki sistem notifikasi bawaan yang sangat fleksibel, mendukung berbagai channel seperti email, database, SMS, dan Slack. Dalam tutorial ini, kita akan fokus pada dua channel paling umum: database dan email.
Persiapan: Tabel Notifikasi Database
Untuk notifikasi channel database, Laravel membutuhkan tabel khusus. Buat dengan perintah:
php artisan make:notifications-table
php artisan migrate
Ini akan membuat tabel notifications yang menyimpan notifikasi dalam format JSON.
Membuat Kelas Notifikasi
Buat kelas notifikasi menggunakan Artisan:
php artisan make:notification OrderPlaced
File akan dibuat di app/Notifications/OrderPlaced.php. Edit file tersebut:
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class OrderPlaced extends Notification implements ShouldQueue
{
use Queueable;
public function __construct(
protected array $orderData
) {}
// Tentukan channel yang digunakan
public function via(object $notifiable): array
{
return ['database', 'mail'];
}
// Konten untuk email
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('Pesanan Kamu Berhasil Dibuat!')
->greeting('Halo, ' . $notifiable->name . '!')
->line('Pesanan kamu dengan nomor #' . $this->orderData['order_number'] . ' telah berhasil kami terima.')
->line('Total pembayaran: Rp ' . number_format($this->orderData['total'], 0, ',', '.'))
->action('Lihat Pesanan', url('/orders/' . $this->orderData['order_id']))
->line('Terima kasih telah berbelanja!');
}
// Konten untuk database
public function toDatabase(object $notifiable): array
{
return [
'order_id' => $this->orderData['order_id'],
'order_number' => $this->orderData['order_number'],
'total' => $this->orderData['total'],
'message' => 'Pesanan #' . $this->orderData['order_number'] . ' berhasil dibuat.',
];
}
}
Mengirim Notifikasi
Ada dua cara mengirim notifikasi di Laravel. Pastikan model User sudah menggunakan trait Notifiable (sudah ada secara default):
// Cara 1: Melalui model (Notifiable trait)
$user = User::find(1);
$user->notify(new OrderPlaced([
'order_id' => 101,
'order_number' => 'ORD-2024-001',
'total' => 250000,
]));
// Cara 2: Melalui Facade Notification (untuk banyak user sekaligus)
use Illuminate\Support\Facades\Notification;
$users = User::where('is_admin', true)->get();
Notification::send($users, new OrderPlaced([
'order_id' => 101,
'order_number' => 'ORD-2024-001',
'total' => 250000,
]));
Mengambil dan Menampilkan Notifikasi Database
Notifikasi database disimpan di tabel dan bisa diakses melalui relasi model User:
// Di controller
$user = auth()->user();
// Semua notifikasi
$notifications = $user->notifications;
// Hanya yang belum dibaca
$unread = $user->unreadNotifications;
// Jumlah belum dibaca
$count = $user->unreadNotifications()->count();
Tampilkan di Blade:
@foreach(auth()->user()->unreadNotifications as $notification)
<div class="notif {{ $notification->read_at ? '' : 'unread' }}">
<p>{{ $notification->data['message'] }}</p>
<small>{{ $notification->created_at->diffForHumans() }}</small>
</div>
@endforeach
Menandai Notifikasi sebagai Sudah Dibaca
// Tandai satu notifikasi
$notification = auth()->user()->notifications()->find($id);
$notification->markAsRead();
// Tandai semua sebagai sudah dibaca
auth()->user()->unreadNotifications->markAsRead();
Konfigurasi Email
Atur konfigurasi email di file .env:
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@aplikasikamu.com"
MAIL_FROM_NAME="${APP_NAME}"
Untuk testing lokal, gunakan Mailtrap atau MAIL_MAILER=log yang akan menulis email ke file log Laravel.
Menggunakan Queue untuk Notifikasi
Karena kelas notifikasi kita mengimplementasikan ShouldQueue, notifikasi akan dikirim secara asinkron lewat queue. Ini sangat penting untuk performa aplikasi agar pengiriman email tidak memblokir request user. Jalankan queue worker:
php artisan queue:work
Untuk development, bisa gunakan QUEUE_CONNECTION=sync di .env agar notifikasi dikirim langsung tanpa queue.
Kesimpulan
Sistem notifikasi Laravel sangat powerful dan mudah digunakan. Dengan satu kelas notifikasi, kamu bisa mengirim pesan ke berbagai channel sekaligus. Langkah selanjutnya bisa mengeksplorasi notifikasi real-time menggunakan channel broadcast dengan Laravel Echo dan Pusher, sehingga notifikasi muncul instan di browser tanpa perlu refresh halaman.