Laravel İle Dinamik Bir Yayın Bildirimi Ve Push Servisi Nasıl Yapılır?

Laravel İle Dinamik Bir Yayın Bildirimi Ve Push Servisi Nasıl Yapılır?
Laravel İle Dinamik Bir Yayın Bildirimi Ve Push Servisi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Gerçek zamanlı bildirim sistemi kurmadan önce geliştirme ortamınızın hazır olduğundan emin olmalısınız. Laravel'in en güncel sürümünde, sistemin kararlı çalışması için aşağıdaki araçların yüklü olması gerekir:

  • PHP 8.3 veya üzeri bir sürüm.
  • Composer paket yöneticisi.
  • Node.js ve NPM (Frontend bildirimlerini dinlemek için gereklidir).
  • Pusher veya Reverb gibi bir WebSocket sunucusu hesabı.
  • Redis (Kuyruk işlemleri için önerilir).

Projenizin kök dizininde composer require pusher/pusher-php-server komutunu çalıştırarak gerekli Pusher kütüphanesini kurarak işe başlayabilirsiniz. Eğer yerel ortamda test yapıyorsanız, Laravel'in yerleşik WebSocket sunucusu olan Reverb'ü kullanmak geliştirme sürecini ciddi oranda hızlandıracaktır.

Laravel Yayınlama (Broadcasting) Yapılandırması

Laravel'de yayınlama işlemleri config/broadcasting.php dosyasından yönetilir. İlk adım, bu dosyayı projenizin ihtiyaçlarına göre yapılandırmaktır. Pusher veya Reverb kullanırken, .env dosyanızdaki kimlik bilgilerinin doğruluğu hayati önem taşır.

BROADCAST_CONNECTION=pusher

PUSHER_APP_ID=123456
PUSHER_APP_KEY=your_key
PUSHER_APP_SECRET=your_secret
PUSHER_APP_CLUSTER=mt1

Yukarıdaki yapılandırma, uygulamanızın bildirimleri hangi kanal üzerinden göndereceğini belirler. BROADCAST_CONNECTION anahtarını pusher veya reverb olarak ayarladığınızda, Laravel arka planda tüm yayın işlemlerini bu sürücü üzerinden yönlendirecektir.

Bildirim Olaylarını (Events) Oluşturma

Bildirim göndermek için Laravel'in "Event" (Olay) sınıfını kullanırız. Bir olay sınıfı, ShouldBroadcast arayüzünü (interface) uyguladığında, Laravel bu olayı otomatik olarak WebSocket kanalına iletir. Aşağıdaki örnekte, bir yayın bildirimi için gerekli olan NewAnnouncement olayını görebilirsiniz.

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;

class NewAnnouncement implements ShouldBroadcast
{
    use InteractsWithSockets, SerializesModels;

    public $message;

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

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

Bu kod bloğu, announcements adlı genel bir kanala mesaj yayınlar. ShouldBroadcast arayüzü, Laravel'in bu sınıfı otomatik olarak kuyruğa almasını ve WebSocket üzerinden iletmesini sağlar.

Frontend Tarafında Bildirimleri Dinleme

Backend tarafında gönderilen mesajları tarayıcıda yakalamak için Laravel Echo kullanılır. JavaScript tarafında bildirimleri dinlemek, kullanıcının sayfayı yenilemesine gerek kalmadan içeriği görmesini sağlar. Aşağıdaki kod, uygulamanızın ana JavaScript dosyasında yer almalıdır.

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

window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_PUSHER_APP_KEY,
    cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,
    forceTLS: true
});

window.Echo.channel('announcements')
    .listen('NewAnnouncement', (e) => {
        console.log('Yeni Bildirim:', e.message);
        alert(e.message);
    });

Burada window.Echo.channel metodu, sunucudan gelen veriyi gerçek zamanlı olarak dinler. .listen fonksiyonu, backend'de tanımladığınız olay sınıfının adını bekler.

Bildirim Yöntemlerinin Karşılaştırılması

Uygulamanız için en uygun bildirim yöntemini seçerken aşağıdaki tabloyu referans alabilirsiniz:

Yöntem Avantajı Dezavantajı
Pusher (SaaS) Kurulumu kolay, ölçeklenebilir. Ücretli planlar gerektirebilir.
Laravel Reverb Yerel, hızlı, Laravel uyumlu. Sunucu yönetimi gerektirir.
Soketi.io Çok esnek yapı. Laravel entegrasyonu daha karmaşık.

Güvenlik ve Yetkilendirme (Private Channels)

Her bildirim herkese açık olmayabilir. Kullanıcıya özel bildirimler göndermek için "Private Channels" (Özel Kanallar) kullanmalısınız. Bu, sadece yetkili kullanıcıların kanala abone olabilmesini sağlar. routes/channels.php dosyasında yetkilendirme mantığını tanımlamanız gerekir.

Broadcast::channel('user.{id}', function ($user, $id) {
    return (int) $user->id === (int) $id;
});

Bu kod, yalnızca oturum açmış kullanıcının kendi ID'sine ait kanalı dinlemesine izin verir. Yetkisiz erişim denemeleri Laravel tarafından otomatik olarak reddedilir.

Kritik Güvenlik Uyarısı: Özel kanallarda yetkilendirme mantığını her zaman sunucu tarafında doğrulayın. Kullanıcı ID'lerini asla istemciden (frontend) gelen veriye göre doğrudan kabul etmeyin; her zaman oturum (session) bilgilerini kullanın.

Sıkça Sorulan Sorular

WebSocket sunucusu çalışmıyorsa ne yapmalıyım?

Öncelikle php artisan reverb:start veya Pusher panelinizdeki bağlantı durumunu kontrol edin. .env dosyasındaki anahtarların doğruluğundan ve firewall ayarlarınızın gerekli portlara (genellikle 6001) izin verdiğinden emin olun.

Bildirimler neden gecikmeli ulaşıyor?

Gecikmeler genellikle kuyruk (queue) sistemindeki yoğunluktan kaynaklanır. QUEUE_CONNECTION ayarınızı sync yerine redis veya database yaparak bildirimleri arka planda asenkron olarak işleyin.

Mobil cihazlarda bildirim çalışır mı?

Laravel Echo, tarayıcı tabanlıdır. Mobil uygulamalar için Firebase Cloud Messaging (FCM) entegrasyonu yapmanız gerekebilir, ancak web görünümü (webview) kullanıyorsanız bu rehberdeki yöntem aynen geçerlidir.

Üretim ortamında (Production) nelere dikkat etmeliyim?

Üretim ortamında mutlaka HTTPS kullanın. WebSocket bağlantıları güvenli bir protokol üzerinden yapılmalıdır. Ayrıca, sunucu kaynaklarını korumak için kanal aboneliklerini sınırlayın.

Aynı anda binlerce kullanıcıya bildirim göndermek sistemi yorar mı?

Doğrudan döngü içerisinde bildirim göndermek yerine, Laravel'in BroadcastEvent sınıfını kullanarak olayı kuyruğa atın. Bu, ana iş parçacığınızın (main thread) kilitlenmesini engeller.

Bildirimleri Veritabanında Kalıcı Hale Getirme ve Okundu Bilgisi Yönetimi

Gerçek zamanlı bildirimler, kullanıcı o an uygulamada aktifse mükemmel çalışır. Ancak kullanıcı çevrimdışı olduğunda bu bildirimler kaybolur. Laravel'in yerleşik DatabaseNotification sistemi, bildirimleri kalıcı hale getirmenize ve kullanıcı giriş yaptığında "Okunmamış Bildirimler" listesini çekmenize olanak tanır.

Öncelikle bildirim tablosunu oluşturmak için terminalde şu komutu çalıştırın:

php artisan notifications:table
php artisan migrate

Ardından, bildirim sınıfınızın via metoduna database kanalını ekleyin ve bildirim verisini toArray metodu ile tanımlayın:

public function via($notifiable)
{
    return ['broadcast', 'database'];
}

public function toArray($notifiable)
{
    return [
        'message' => 'Yeni bir yayın başlatıldı!',
        'link' => '/yayinlar/' . $this->yayin->id,
    ];
}

Kullanıcı giriş yaptığında okunmamış bildirimleri şu şekilde listeleyebilirsiniz:

$unreadNotifications = $user->unreadNotifications;

foreach ($unreadNotifications as $notification) {
    echo $notification->data['message'];
    $notification->markAsRead(); // Okundu olarak işaretle
}

İleri Seviye Hata Ayıklama ve Loglama Stratejileri

WebSocket tabanlı sistemlerde hata ayıklamak, geleneksel HTTP isteklerine göre daha karmaşıktır. İstemci ile sunucu arasındaki bağlantı koptuğunda veya olaylar tetiklenmediğinde izlemeniz gereken adımlar şunlardır:

  • Echo Bağlantı Durumu: İstemci tarafında bağlantı hatalarını yakalamak için error callback fonksiyonunu kullanın.
  • Horizon İzleme: Eğer bildirimleri ShouldQueue kullanarak kuyruğa alıyorsanız, Laravel Horizon arayüzü üzerinden işlenen işlerin durumunu kontrol edin.
  • Log Seviyeleri: config/broadcasting.php dosyasında debug modunu aktif ederek, WebSocket sunucusuna giden paketleri inceleyin.

Bağlantı hatalarını yakalamak için frontend tarafında şu yapıyı kurun:

Echo.connector.pusher.connection.bind('error', (err) => {
    console.error('WebSocket Bağlantı Hatası:', err);
    if (err.type === 'PusherError') {
        // Token süresi dolmuş olabilir, yeniden kimlik doğrulama yapın
    }
});

Ayrıca, sunucu tarafında olayların tetiklenip tetiklenmediğini anlamak için EventServiceProvider içerisinde olayları loglayabilirsiniz:

// App\Providers\EventServiceProvider.php
protected $listen = [
    YayinBasladi::class => [
        LogBildirimGonderimi::class,
    ],
];

// LogBildirimGonderimi.php
public function handle(YayinBasladi $event)
{
    Log::info('Bildirim tetiklendi: ' . $event->yayin->id);
}

Bu yöntemler, uygulamanızın bildirim altyapısını daha dayanıklı hale getirmenize ve üretim ortamında oluşabilecek "sessiz hataları" hızlıca tespit etmenize yardımcı olacaktır.

Sonuç

Laravel ile dinamik bir yayın bildirimi ve push servisi kurmak, uygulamanızın kullanıcı etkileşimini bir üst seviyeye taşır. Bu rehberde, temel yayınlama mantığından özel kanal güvenliğine kadar kritik adımları tamamladık. Gerçek zamanlı sistemlerde en önemli kural, sunucu yükünü minimize etmek ve kullanıcı gizliliğini korumaktır.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Canlı projelerinizde kullanmadan önce güvenlik açıklarını (XSS, SQL Injection vb.) göz önünde bulundurarak gerekli doğrulama katmanlarını eklediğinizden emin olun.

Bir sonraki adım olarak, bildirimleri veritabanına kaydederek kullanıcının çevrimdışı olduğu durumlarda "Geçmiş Bildirimler" listesi oluşturmayı deneyebilirsiniz. Laravel'in DatabaseNotification sınıfı bu konuda size oldukça yardımcı olacaktır.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Verimlilik ve zaman yönetimi odaklı pratik bilgiler konusunda içerik üretiyorum. Okuyuculara günlük rutinlerinde hız kazandıracak uygulanabilir stratejiler sunuyorum.

Yorumlar (0)

Yorum Yaz