Laravel İle Gerçek Zamanlı Bildirim Sistemi Nasıl Yapılır?

Laravel İle Gerçek Zamanlı Bildirim Sistemi Nasıl Yapılır?
Laravel İle Gerçek Zamanlı Bildirim Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Gerçek zamanlı bir sistem kurmak için projenizin güncel bir Laravel sürümüne (2026 itibarıyla 11.x veya üzeri) sahip olması gerekir. Ayrıca, WebSocket bağlantılarını yönetmek için bir sürücüye ihtiyacınız vardır. Laravel Reverb, yerleşik ve yüksek performanslı bir WebSocket sunucusu olduğu için bu rehberde temel olarak onu kullanacağız.

  • PHP 8.2+ sürümü yüklü bir sunucu ortamı.
  • Composer paket yöneticisi.
  • Node.js ve NPM (İstemci tarafı kütüphaneleri için).
  • Redis veya veritabanı sürücüsü (Bildirim kuyrukları için).

Kurulumu başlatmak için terminalinizde Laravel Reverb paketini projenize dahil etmelisiniz:

composer require laravel/reverb

Bu komut, WebSocket sunucusunu çalıştırmak için gerekli olan konfigürasyon dosyalarını ve `reverb:start` komutunu projenize ekler. Kurulum sonrası php artisan reverb:install komutu ile gerekli servis sağlayıcıları oluşturmayı unutmayın.

Event (Olay) Yapılandırması

Laravel'de gerçek zamanlı bildirimlerin temeli Event sınıflarına dayanır. Bir olay gerçekleştiğinde (örneğin yeni bir yorum yapıldığında), bu olay yayınlanır ve WebSocket üzerinden ilgili kanallara iletilir. İlk adım olarak bir Event sınıfı oluşturalım.

php artisan make:event OrderShipped

Oluşturulan sınıfın ShouldBroadcast arayüzünü (interface) uygulaması gerekir. Bu, Laravel'e bu olayın dış dünyaya yayınlanması gerektiğini söyler.

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class OrderShipped implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $orderId;

    public function __construct($orderId)
    {
        $this->orderId = $orderId;
    }

    public function broadcastOn()
    {
        return new Channel('orders');
    }
}

Burada broadcastOn metodu, olayın hangi kanalda yayınlanacağını belirler. Channel sınıfı, herkese açık kanallar için kullanılır; özel bildirimler için PrivateChannel tercih edilmelidir.

Broadcasting Ayarları ve WebSocket Bağlantısı

.env dosyanızda yayınlama sürücüsünü (broadcasting driver) reverb olarak ayarlamanız gerekir. Bu, Laravel'in WebSocket trafiğini nereye yönlendireceğini belirler.

BROADCAST_CONNECTION=reverb
REVERB_SERVER=localhost
REVERB_PORT=8080

Ardından, uygulamanızın WebSocket sunucusunu başlatmak için terminalde şu komutu çalıştırın:

php artisan reverb:start --debug

Bu komut, sunucunun gelen bağlantıları dinlemesini sağlar. --debug bayrağı, bağlantı hatalarını ve yayınlanan paketleri terminalde görmenize yardımcı olur. Geliştirme aşamasında bu çıktılar, sistemin doğru çalışıp çalışmadığını anlamak için kritiktir.

İstemci Tarafında Bildirimleri Dinleme

Sunucudan gönderilen veriyi tarayıcıda yakalamak için Laravel Echo ve Pusher JS (veya Reverb istemcisi) kullanılır. resources/js/bootstrap.js dosyanızda Echo yapılandırmasının aktif olduğundan emin olun.

import Echo from 'laravel-echo';
import Pusher from 'pusher-js';

window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'reverb',
    key: import.meta.env.VITE_REVERB_APP_KEY,
    wsHost: import.meta.env.VITE_REVERB_HOST,
    wsPort: import.meta.env.VITE_REVERB_PORT ?? 80,
    forceTLS: false,
    enabledTransports: ['ws', 'wss'],
});

Artık JavaScript tarafında kanala abone olabilir ve gelen veriyi dinleyebilirsiniz:

window.Echo.channel('orders')
    .listen('OrderShipped', (e) => {
        console.log('Yeni sipariş bildirimi:', e.orderId);
        alert('Siparişiniz yola çıktı: ' + e.orderId);
    });

Yöntemlerin Karşılaştırılması

Yöntem Avantaj Dezavantaj
Laravel Reverb Düşük gecikme, yerleşik, kolay kurulum Sunucu yönetimi gerektirir
Pusher (SaaS) Bakım gerektirmez, ölçeklenebilir Maliyetli olabilir
Soketi.io Çok geniş ekosistem Laravel ile entegrasyonu daha karmaşık
Kritik Güvenlik Uyarısı: Özel (Private) kanalları kullanırken routes/channels.php dosyasında yetkilendirme mantığını (authorization) mutlaka tanımlayın. Yetkisiz kullanıcıların bildirimleri dinlemesini engellemek için return $user->id === $order->user_id; gibi kontrolleri asla atlamayın.

Sıkça Sorulan Sorular

Bildirimler neden tarayıcıya ulaşmıyor?

Öncelikle php artisan reverb:start komutunun çalışıp çalışmadığını kontrol edin. Ardından .env dosyasındaki BROADCAST_CONNECTION değerinin doğru ayarlandığından ve JavaScript tarafındaki VITE_ değişkenlerinin doğru yüklendiğinden emin olun.

Özel bildirimleri nasıl gönderirim?

Channel yerine PrivateChannel kullanarak ve routes/channels.php dosyasında yetkilendirme mantığını kurarak kullanıcıya özel bildirimler gönderebilirsiniz.

Reverb üretim ortamında güvenli mi?

Evet, ancak üretim ortamında mutlaka SSL/TLS sertifikası (WSS) kullanmalı ve sunucu kaynaklarını (RAM/CPU) izlemelisiniz. Yüksek trafikli uygulamalarda Redis tabanlı bir kuyruk sistemi kullanmak performansı artırır.

Birden fazla kanalı aynı anda dinleyebilir miyim?

Evet, Laravel Echo ile farklı kanallara .channel().listen() zincirleri ekleyerek aynı anda birden fazla olay akışını takip edebilirsiniz.

Bildirimleri veritabanına kaydetmeli miyim?

Evet, WebSocket bağlantısı koptuğunda kullanıcının bildirimleri kaçırmaması için bildirimleri hem veritabanına kaydetmeli hem de WebSocket üzerinden anlık göndermelisiniz.

Kod Güvenliği Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Uygulamanızda kullanıcı girdilerini her zaman doğrulayın, XSS ve SQL Injection saldırılarına karşı Laravel'in yerleşik koruma mekanizmalarını (Eloquent ORM, Request Validation) kullanın.

Performans Optimizasyonu ve Ölçeklendirme Stratejileri

Gerçek zamanlı sistemlerde kullanıcı sayısı arttıkça, WebSocket sunucunuz üzerindeki yük doğrusal olarak artar. Laravel Reverb veya Pusher gibi servisleri kullanırken sistemin tıkanmaması için şu stratejileri izlemelisiniz:

  • Event Kuyruklama (Queueing): Bildirimleri doğrudan tetiklemek yerine, ShouldBroadcast arayüzünü kullanan event'lerinizi queue üzerinden gönderin. Bu, HTTP isteğinin bekleme süresini minimize eder.
  • Payload Boyutunu Küçültme: WebSocket üzerinden gönderdiğiniz JSON verilerini mümkün olduğunca sade tutun. Büyük veri setlerini broadcast etmek yerine, sadece ID gönderip istemcinin veriyi API üzerinden çekmesini sağlayın.
  • Redis Kullanımı: Broadcasting sürücüsü olarak redis kullanmak, yüksek trafikli uygulamalarda bellek tabanlı hızlı bir mesajlaşma katmanı sağlar.
// config/broadcasting.php içerisinde Redis yapılandırması
'connections' => [
    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
    ],
],

Üretim Ortamında Hata Ayıklama ve İzleme

Canlı bir uygulamada bildirimlerin ulaşmadığını fark ettiğinizde, sorunu tespit etmek için sistematik bir yaklaşım sergilemelisiniz. İlk adım, Laravel'in telescope paketini veya storage/logs/laravel.log dosyasını incelemektir.

WebSocket Bağlantı Hatalarını Giderme

İstemci tarafında 403 Forbidden hatası alıyorsanız, bu genellikle routes/channels.php dosyasındaki yetkilendirme mantığından kaynaklanır. Kanalın doğru kullanıcı tarafından dinlenip dinlenmediğini kontrol etmek için şu basit hata ayıklama yöntemini kullanın:

// routes/channels.php
Broadcast::channel('orders.{orderId}', function ($user, $orderId) {
    $order = \App\Models\Order::find($orderId);
    
    // Hata ayıklama için loglama
    \Log::info("Kullanıcı kanal kontrolü yapılıyor: " . $user->id);
    
    return (int) $user->id === (int) $order->user_id;
});

Ayrıca, tarayıcı konsolunda Pusher.logToConsole = true; satırını ekleyerek WebSocket trafiğini anlık olarak izleyebilir ve bağlantının kopma nedenlerini (örneğin SSL sertifika hataları veya CORS kısıtlamaları) görebilirsiniz.

Deployment Sürecinde Dikkat Edilmesi Gerekenler

Uygulamanızı canlıya alırken (production), WebSocket sunucusunun arka planda sürekli çalışması için Supervisor kullanmanız şarttır. Aksi takdirde, sunucu yeniden başlatıldığında bildirim sisteminiz devre dışı kalır.

# Supervisor yapılandırma örneği (/etc/supervisor/conf.d/reverb.conf)
[program:reverb]
command=php /var/www/html/artisan reverb:start --host=0.0.0.0 --port=8080
user=www-data
autostart=true
autorestart=true
stderr_logfile=/var/log/reverb.err.log
stdout_logfile=/var/log/reverb.out.log
Önemli İpucu: Eğer Nginx kullanıyorsanız, WebSocket bağlantılarının kesilmemesi için proxy_set_header Upgrade $http_upgrade; ve proxy_set_header Connection "Upgrade"; direktiflerinin yapılandırma dosyanızda tanımlı olduğundan emin olun.

Sonuç

Laravel ile gerçek zamanlı bildirim sistemi kurmak, doğru araçlar ve mimari yaklaşımlarla oldukça verimli bir süreçtir. Reverb gibi modern araçlar sayesinde artık karmaşık altyapılarla uğraşmadan, olay tabanlı bir sistemle kullanıcılarınıza anlık etkileşimler sunabilirsiniz. Bu rehberde öğrendiğiniz temel yapıları kullanarak, bir sonraki adımda bildirimlerinizi veritabanına kaydeden ve "okundu" bilgisi tutan daha gelişmiş bir bildirim paneli tasarlayabilirsiniz. Başarılar dilerim.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Dijital içerik editörlüğü geçmişimle, adım adım rehberlerin en anlaşılır ve uygulanabilir şekilde kurgulanmasını sağlıyorum. Teknik detayları herkes için sadeleştirmeyi seviyorum.

Yorumlar (0)

Yorum Yaz