Laravel’da gerçek zamanlı özelliklerin WebSocket sunucusu, Redis pub/sub ve karmaşık JavaScript gerektirdiğine dair yaygın bir yanlış anlama var. Birçok kullanım senaryosu — canlı sayıcılar, bildirim rozetleri, otomatik yenilenen tablolar, anlık form geri bildirimleri — Livewire ile karmaşıklığın çok az bir kısmıyla %90 oranında çözülebilir. Bu makale, gerçek bir projeye anında uygulayabileceğiniz çalışan kodlar ile polling, tarayıcı ve bileşen olayları ile lazy loading gibi üç pratik deseni inceleyecek.
Neden Livewire, WebSockets’dan Önce?
Neden Livewire, WebSockets’dan Önce?
WebSockets güçlüdür, fakat gerçek bir operasyonel yük taşır: sürekli bağlantı sunucusu (Laravel Reverb, Soketi veya Pusher), kuyruk işçi süreçleri, yayın yapılandırması ve frontend Echo kurulumu gerektirir. Bu, sunucudan gerçek bir push gerektiğinde (örneğin, iş birliği ile düzenleme veya canlı sohbet) doğru bir araçtır.
Ancak “gerçek zamanlı” gereksinimlerin çoğu aslında sadece yakın gerçek zamanlıdır: her 5 saniyede bir yenilenen bir gösterge paneli, kullanıcı navigasyon yaptığında güncellenen bir bildirim sayısı, yazarken sorgu yapan bir arama kutusu. Livewire, bunların hepsini yerel olarak ele alır ve yığını basit tutar.
Desen 1: Canlı Veri için Polling
Desen 1: Canlı Veri için Polling
Livewire’ın #[Poll] özelliği (Livewire v3) bir bileşeni güncel tutmanın en hızlı yoludur. İşte bir e-ticaret yönetim paneli için canlı sipariş sayacı:
namespace App\Livewire;
use App\Models\Order;
use Livewire\Attributes\Poll;
use Livewire\Component;
class PendingOrderCount extends Component
{
#[Poll(5000)] // Her 5 saniyede bir polling yapar
public int $count = 0;
public function mount(): void
{
$this->count = Order::where('status', 'pending')->count();
}
public function render()
{
$this->count = Order::where('status', 'pending')->count();
return view('livewire.pending-order-count');
}
}
class="flex items-center gap-2">
class="text-sm text-gray-500">Pending Orders
class="rounded-full bg-red-500 px-2 py-0.5 text-xs font-bold text-white">
{{ $count }}
Polling, belirlediğiniz aralıkta bir XHR isteği fırlatır. Düşük trafikli yönetim araçları için bu tamamen kabul edilebilir. Yüksek trafikli sayfalar için, aralığı 30 saniyeye kadar uzatın veya sorgu sonucunu önbelleğe alın — her tikte veritabanınıza yüklenmekten kaçının.
Sekme Gizlendiğinde Polling’i Durdurma
Sekme Gizlendiğinde Polling’i Durdurma
Livewire v3, kullandığınız keep-alive ile tarayıcının Visibility API’sine saygı gösterir; fakat bunu açık hale getirebilirsiniz. İşte bir örnek:
x-data="{ visible: true }"
x-on:visibilitychange.window="visible = !document.hidden"
wire:poll.5000ms="refresh"
x-bind:wire:poll.5000ms="visible ? 'refresh' : ''"
>
Bu küçük değişiklik, kullanıcıların birçok sekme açık olduğunda sunucu yükünü anlamlı bir şekilde azaltabilir.
Desen 2: Anlık Geri Bildirim için Bileşen Olayları
Desen 2: Anlık Geri Bildirim için Bileşen Olayları
Polling, pull tabanlıdır. Olaylar, Livewire bileşen ağaçları içinde push tabanlıdır — form gönderme onayı, ana-alt bileşen iletişimi veya bir toast bildirimi tetiklemek gibi durumlarda mükemmeldir.
Varsayalım ki bir CreateTask formunuz ve aynı sayfada bir TaskList var. Bir görev kaydedildiğinde, listenin sayfa yenilenmeden anında güncellenmesini istiyorsunuz.
// App/Livewire/CreateTask.php
public function save(): void
{
$this->validate([
'title' => 'required|min:3',
]);
Task::create(['title' => $this->title, 'user_id' => auth()->id()]);
$this->reset();
$this->dispatch(); // Olayı tetikler
}
// App/Livewire/TaskList.php
use Livewire\Attributes\On;
class TaskList extends Component
{
#[On('task-created')]
public function refreshList(): void
{
// Livewire otomatik olarak yeniden oluşturur; sadece dinleyiciyi tanımlayın
}
public function render()
{
return view('livewire.task-list', [
=> Task::where(, auth()->id())
->latest()
->get(),
]);
}
}
#[On] niteliği Livewire v3 ile eski $listeners dizisinin yerini alıyor. Temiz, deklaratif ve izlenmesi kolay. CreateTask tetikleyici task-created olduğunda, TaskList taze verilerle yeniden oluşturulur — herhangi bir JavaScript bağlantısına gerek duyulmaz.
Tarayıcıya Olay Gönderme (Alpine.js Entegrasyonu)
Tarayıcıya Olay Gönderme (Alpine.js Entegrasyonu)
Bazen, Livewire işlemi sonucunda bir JavaScript davranışını tetiklemek isteyebilirsiniz — bir toast gösterme, bir modal açma veya bir CSS animasyonu başlatma gibi. dispatch ile kendinize ait bir alan veya tarayıcı olayı gönderebilirsiniz:
// Livewire bileşeninizde
$this->dispatch(, message: );
x-data="{ show: false, message: '' }"
x-on:notify.window="message = $event.detail.message; show = true; setTimeout(() => show = false, 3000)"
>
x-show="show" x-transition class="toast">
x-text="message">
Bu, TALL yığını çalışırken Livewire sunucu durumunu yönetir, Alpine kullanıcı arayüzü mikro etkileşimlerini yönetir; özel JavaScript dosyalarına ihtiyaç duyulmaz.
Desen 3: Algılanan Performans için Lazy Loading
Desen 3: Algılanan Performans için Lazy Loading
Gerçek zamanlı UX sadece canlı verilerle ilgili değildir — aynı zamanda sayfanın hızlı hissettirmesi ile de ilgilidir. Livewire’ın lazy niteliği, bir bileşenin ilk renderını viewport’a girdiğinde erteleyerek, birçok maliyetli widget içeren paneller için önemli bir kazanç sağlar.
lazy />
lazy />
lazy />
Bileşen yüklenirken, placeholder metodunu kullanarak bir yer tutucu gösterebilirsiniz:
// App/Livewire/RevenueChart.php
public function placeholder()
{
return }
Bütün bunlar, İlk İçerik Boyama (First Contentful Paint) puanlarını dramatik şekilde iyileştirir ve kullanıcılara bir şeylerin yüklendiğine dair anında görsel geri bildirim sağlar — bu da kendisi de bir tür gerçek zamanlı kullanıcı deneyimidir.
Bu üç desenin nasıl bir araya geldiğine dair örnek vermek gerekirse, HanzWeb’de birçok müşteri odaklı gösterge paneli oluştururken genellikle yöneticim sayfalarını şu şekilde yapılandırıyoruz:
Bu, hızlı yüklenen, sürekli polling yükü olmadan makul biçimde güncel kalan ve kullanıcı eylemlerine anında yanıt veren bir gösterge paneli sağlar — tek bir WebSocket yapılandırması satırı olmadan. Ürün arayüzlerine nasıl dönüştüğünü görmek istiyorsanız, farklı sektörlerdeki müşteriler için Livewire gücünde yapılmış panellerimizi görebilirsiniz.
Gereksinimlerinizi dürüstçe değerlendirin. Livewire polling, şu durumlarda doğru bir araç değildir:
Bunlar için Laravel Echo ile birlikte Laravel Reverb’i (Laravel 11’de tanıtılan resmi WebSocket sunucusu) kullanmalısınız. Ancak çoğu iş uygulaması — CRM’ler, yönetim panelleri, SaaS panelleri, rezervasyon sistemleri — için Livewire’ın yerleşik özellikleri fazlasıyla yeterlidir.
Laravel’da gerçek zamanlı kullanıcı deneyimi, altyapı karmaşıklığı anlamına gelmek zorunda değil. Livewire polling, gösterge paneli yenileme senaryolarını kapsar, bileşen olayları anlık çapraz bileşen iletişimini ele alır ve lazy loading uygulamanızın veriler gelmeden önce hızlı hissettirmesini sağlar. Bu üç deseni ustalıkla uygulayarak, müşterilerinizin talep edeceği gerçek zamanlı gereksinimlerin çoğunu — kodun okunabilir, test edilebilir ve bakım yapılabilir olmasını sağlayarak — çözebilirsiniz.
Kaynak: Orijinal Makale


