PHP Logobeyondcode/laravel-websockets

Laravel WebSockets, `beyondcode/laravel-websockets` paketi, Laravel uygulamaları için açık kaynaklı ve ücretsiz bir WebSocket sunucusu sağlar. Bu paket, Laravel'in yerleşik olay yayınlama (event broadcasting) sistemini kullanarak gerçek zamanlı uygulamalar geliştirmenize olanak tanır. Özellikle, popüler üçüncü taraf WebSocket hizmeti olan Pusher'ın API'siyle tam uyumlu bir sunucu sunar.

Temel Amaç ve Özellikler:

1. Pusher Uyumluluğu: Laravel'in `BroadcastManager`'ı ve `laravel-echo` JavaScript kütüphanesi ile sorunsuz çalışır. Mevcut Pusher yapılandırmanızla kolayca entegre edilebilir, böylece harici bir Pusher aboneliğine gerek kalmaz.
2. Kendi Kendine Barındırma (Self-Hosted): Verilerinizi ve WebSocket sunucunuzu kendi sunucularınızda barındırarak tam kontrol sağlar ve potansiyel üçüncü taraf maliyetlerinden kaçınmanıza yardımcı olur.
3. Gerçek Zamanlı Uygulamalar: Canlı sohbet, bildirimler, canlı gösterge tabloları, gerçek zamanlı güncelleme akışları gibi birçok gerçek zamanlı özelliği uygulamanıza entegre etmenizi sağlar.
4. Yönetim Paneli: Paketle birlikte gelen bir web arayüzü (dashboard) sayesinde, bağlı istemcileri, yayınlanan olayları ve kanal aktivitesini gerçek zamanlı olarak izleyebilirsiniz. Bu, hata ayıklama ve izleme için çok değerli bir araçtır.
5. Özel ve Varlık Kanalları (Private & Presence Channels): Laravel'in kimlik doğrulama mekanizmasıyla entegre olarak güvenli özel kanallar ve bir kanaldaki mevcut kullanıcıları izlemek için varlık kanalları (presence channels) oluşturmayı destekler.
6. Ölçeklenebilirlik: Birden fazla sunucu üzerinde çalıştırılarak yük dengeleyiciler arkasında ölçeklenebilir bir yapı sunar.

Nasıl Çalışır?

Bir Laravel uygulaması `beyondcode/laravel-websockets` ile yapılandırıldığında, olaylar `ShouldBroadcast` arayüzünü uygulayan bir PHP sınıfı aracılığıyla yayınlanır. Laravel'in yayınlama sürücüsü `websockets` olarak ayarlandığında, bu olaylar paket tarafından başlatılan WebSocket sunucusuna gönderilir. Sunucu, ilgili kanallara abone olan tüm bağlı istemcilere olayı iletir. İstemciler genellikle `laravel-echo` ve `pusher-js` kütüphanelerini kullanarak bu olayları dinler ve UI'larını günceller.

Kurulum ve Kullanım Adımları (Özet):

1. `composer require beyondcode/laravel-websockets` ile paketi kurun.
2. `php artisan vendor:publish --provider="BeyondCode\\LaravelWebSockets\\WebSocketsServiceProvider" --tag="config"` komutuyla yapılandırma dosyasını yayınlayın.
3. `php artisan migrate` komutunu çalıştırarak gerekli veritabanı tablolarını oluşturun (istatistikler için).
4. `.env` dosyanızda `BROADCAST_DRIVER=websockets` olarak ayarlayın ve Pusher yapılandırma değerlerini (`PUSHER_APP_ID`, `PUSHER_APP_KEY`, `PUSHER_APP_SECRET`, `PUSHER_HOST`, `PUSHER_PORT`) kendi sunucu ayarlarınıza göre güncelleyin.
5. `php artisan websockets:serve` komutuyla WebSocket sunucusunu başlatın.
6. `resources/js/bootstrap.js` dosyanızda `laravel-echo`'yu kendi WebSocket sunucunuza bağlanacak şekilde yapılandırın.

Bu paket, Laravel ekosisteminde güçlü ve esnek gerçek zamanlı özellikler sunan, dış bağımlılıkları minimize eden mükemmel bir çözümdür.

Example Code

```php
<?php

// 1. Olay (Event) Tanımı: App\Events\NewChatMessage.php
// Bu olay yayınlandığında, WebSocket sunucusu aracılığıyla dinleyen istemcilere ulaşacaktır.

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 NewChatMessage implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $username;
    public $message;

    /
     * Yeni bir olay örneği oluşturun.
     *
     * @return void
     */
    public function __construct(string $username, string $message)
    {
        $this->username = $username;
        $this->message = $message;
    }

    /
     * Olayın yayınlanması gereken kanalları alın.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('chat-channel'); // 'chat-channel' adlı bir kanala yayınla
    }

    /
     * İstemci tarafında olayın dinleneceği adını alın.
     *
     * @return string
     */
    public function broadcastAs()
    {
        return 'new-message'; // İstemciler '.new-message' olarak dinleyecek
    }
}

// 2. Olayı Yayınlama: App\Http\Controllers\ChatController.php (Örnek bir Controller metodu)
// Bir HTTP isteği geldiğinde veya başka bir olay tetiklendiğinde bu olay yayınlanabilir.

namespace App\Http\Controllers;

use App\Events\NewChatMessage;
use Illuminate\Http\Request;

class ChatController extends Controller
{
    public function sendMessage(Request $request)
    {
        $request->validate([
            'username' => 'required|string|max:255',
            'message' => 'required|string|max:1000',
        ]);

        // Yeni bir sohbet mesajı olayını yayınla
        event(new NewChatMessage($request->username, $request->message));

        return response()->json(['status' => 'Mesaj başarıyla gönderildi!']);
    }
}

// 3. .env Dosyası Yapılandırması (Önemli Parçalar):
// WebSocket sunucusunun nasıl çalıştığını belirleyen ortam değişkenleri.

// BROADCAST_DRIVER, websockets olarak ayarlanmalıdır.
BROADCAST_DRIVER=websockets

// Pusher uyumlu sunucu için kimlik bilgileri. Kendi değerlerinizle güncelleyin.
PUSHER_APP_ID=12345
PUSHER_APP_KEY=your_app_key
PUSHER_APP_SECRET=your_app_secret

// WebSocket sunucunuzun adresi ve portu.
PUSHER_HOST=127.0.0.1  // Veya üretimde sunucunuzun IP/alan adı
PUSHER_PORT=6001
PUSHER_SCHEME=http     // TLS/SSL kullanıyorsanız https yapın

// 4. Client-side (JavaScript ile Laravel Echo kullanarak dinleme - PHP kodu değil ama bağlam için önemli):
/*
// resources/js/bootstrap.js veya özel bir JavaScript dosyası
import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY, // .env dosyasından alınır
    wsHost: window.location.hostname,    // Veya '127.0.0.1'
    wsPort: 6001,
    forceTLS: false,                     // HTTPS kullanıyorsanız true yapın
    disableStats: true,
    enabledTransports: ['ws', 'wss']
});

// 'chat-channel' kanalını dinle ve 'new-message' olayını yakala
Echo.channel('chat-channel')
    .listen('.new-message', (e) => {
        console.log(`Yeni mesaj geldi: ${e.username}: ${e.message}`);
        // Burada UI'ınızı güncelleyebilirsiniz (örneğin, mesajı chat penceresine ekle)
    });
*/

// WebSocket sunucusunu başlatmak için terminalde:
// php artisan websockets:serve
```