<p>Livewire kullanıcıları, API'siz, frontend/backend ayrımı olmadan, yalnızca PHP'de durum ve yöntemleri tanımlamanın keyfini biliyor. Blade şablonunuz, reaktif bir kullanıcı arayüzüne dönüşüyor. Ancak Livewire'ın frontend'i Alpine.js ile sınırlıdır. Vue ekosisteminden (Vuetify, Pinia, Vue eklentileri) yararlanmak istiyorsanız, Inertia.js'e geçmeniz gerekir. Bu da <code>.vue</code> dosyaları, props geçişi ve istemci tarafı durum yönetimi anlamına gelir.</p>
<p><a href="https://livue-laravel.com/" target="_blank" rel="noopener noreferrer">LiVue</a> bunun çözümüdür: Livewire'ın sunucu tarafı mimarisini Vue 3'e getirir. PHP durum ve mantığı yönetirken, Vue 3 DOM reaktivitesini yönetir ve Vue direktiflerini doğrudan Blade şablonlarında yazmanızı sağlar.</p>
<h2><a name="how-it-works" href="#how-it-works"></a>Nasıl Çalışır</h2>
<p>LiVue'nin istek yaşam döngüsü beş adımdan oluşur:</p>
<ol>
<li>Bir PHP Bileşen sınıfı, genel özellikler (reaktif durum) ve genel yöntemler (çağrılabilir eylemler) tanımlar.</li>
<li>Blade şablonları Blade sözdizimini Vue direktifleriyle (<code>v-click</code>, <code>v-model</code>, <code>v-if</code>, <code>v-for</code>) birleştirir.</li>
<li>Laravel, sunucu tarafında tam HTML'i oluşturur; durum, sayfaya gömülmeden önce şifrelenir ve HMAC ile imzalanır.</li>
<li>Vue 3, istemcide DOM'u besler.</li>
<li>Kullanıcı etkileşimleri AJAX çağrılarına yol açar; sunucu bileşeni yeniden oluşturur ve DOM'u karşılaştırır.</li>
</ol>
<p>Aynı işlem içinde birden fazla sunucu çağrısı otomatik olarak tek bir HTTP isteğine toplanır ve ağda gidiş dönüşleri azaltır.</p>
<p><a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/livue-architecture.png" class="article-body-image-wrapper"><img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/livue-architecture.png" alt="LiVue istek döngüsü mimarisi" loading="lazy" width="800" height="400"/></a></p>
<h2><a name="installation" href="#installation"></a>Kurulum</h2>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>composer require livue/livue
class Counter extends Component { public int $count = 0;
public function increment(): void
{
$this->count++;
}
public function decrement(): void
{
$this->count--;
}
protected function render(): string
{
return 'livue.counter';
}
<p>Herhangi bir Blade görünümünde <code>@livue('counter')</code> veya <code><counter :count="5"/></code> ile render edebilirsiniz.</p>
<p>Zihinsel model, Livewire'a oldukça benzer: genel özellikler reaktif durumdur, genel yöntemler frontend tarafından çağrılabilir eylemlerdir. Fark, şablonların Alpine yerine Vue direktiflerini kullanmasıdır.</p>
<h2><a name="directive-quick-reference" href="#directive-quick-reference"></a>Direktif Hızlı Referansı</h2>
<p>LiVue, çoğu etkileşim senaryosunu kapsayan tam bir özel direktif seti sunar:</p>
<h3><a name="vclick-call-server-methods" href="#vclick-call-server-methods"></a>v-click: Sunucu Yöntemlerini Çağırma</h3>
<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code><button v-click:save="">Kaydet</button>
<h3><a name="vpoll-auto-polling" href="#vpoll-auto-polling"></a>v-poll: Otomatik Anket</h3>
<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code><p>
Son güncelleme: @{{ lastUpdated }}
<p>Tarayıcı sekmesi ön planda değilken otomatik olarak duraklatılır.</p>
<h3><a name="vintersect-viewport-trigger-infinite-scroll" href="#vintersect-viewport-trigger-infinite-scroll"></a>v-intersect: Görüntüleme Tetikleyici (Sonsuz Kaydırma)</h3>
<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code><p>
<span v-loading="">Daha fazla yükleniyor...</span>
<p>Diğer direktifler arasında <code>v-navigate</code> (SPA navigasyonu), <code>v-dirty</code> (kaydedilmemiş değişiklik uyarısı), <code>v-offline</code> (çevrimdışı durumu), <code>v-sort</code> (sürükle-bırak sıralama) ve <code>v-transition</code> (Görünüm Geçişleri API'si) yer alır.</p>
<h2><a name="three-component-formats" href="#three-component-formats"></a>Üç Bileşen Formatı</h2>
<h3><a name="classbased-default" href="#classbased-default"></a> Sınıf Tabanlı (Varsayılan)</h3>
<p>Yukarıdaki Sayaç örneği: ayrı PHP sınıfı + Blade şablonu.</p>
<h3><a name="single-file-component" href="#single-file-component"></a>Tek Dosya Bileşeni</h3>
<p>PHP mantığı ve şablon aynı <code>.blade.php</code> dosyasında:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code><?php use LiVue\Component;
new class extends Component { public int $count = 0;
public function increment(): void
{
$this->count++;
}
}; ?>
@{{ count }}
<p>Basit bileşenler için en iyi şekilde kullanılır. <code>php artisan make:livue MyComponent --single</code> ile oluşturun.</p>
<h3><a name="multi-file-component" href="#multi-file-component"></a>Çoklu Dosya Bileşeni</h3>
<p>Ayrı PHP, Blade, JS ve CSS dosyalarından oluşan bir klasör:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>resources/views/livue/my-widget/
├── my-widget.php # anonim sınıf ├── my-widget.blade.php # şablon ├── my-widget.js # Vue Composition API (isteğe bağlı) └── my-widget.css # otomatik kapsamlı (isteğe bağlı)
<p>CSS, <code>data-livue-scope-{name}</code> niteliğini kullanarak otomatik olarak kapsamlanır. Müşteri tarafı JS mantığı gerektiren karmaşık bileşenler için en iyisidir.</p>
<h2><a name="page-components-fullpage-routing" href="#page-components-fullpage-routing"></a>Sayfa Bileşenleri: Tam Sayfa Yönlendirme</h2>
<p>LiVue bileşenleri, yönlendirme denetleyicisi olarak hizmet verebilir:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code>// routes/web.php
public function updatingEmail(string $value): string { return strtolower(trim($value)); // Otomatik küçük harfe çevirme ve boşlukları temizleme }
<h2><a name="php-attributes-overview" href="#php-attributes-overview"></a>PHP Özelliklerine Genel Bakış</h2>
<p>LiVue, yapılandırma için PHP 8 Özelliklerini yoğun bir şekilde kullanır:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code>// Özellik
[Url(as: ‘q’, history: true)] // URL sorgu dizisine senkronize et
[Session(key: ‘prefs’)] // Sayfalar arasında kalıcı hale getirin
[Guarded] // Şifrelenmiş, JS’ye görünmez
[Reactive] // Ebeveyn yeniden render edildikçe otomatik güncelleme
// Yöntem
[Computed] // Hesaplanan sonuçları önbelleğe al
[Confirm(‘Are you sure?’)] // Onay iletişim kutusu göster
[Renderless] // HTML yeniden render’lamayı atla
[On(‘event-name’)] // Olay dinleyici
// Sınıf
[Island] // İzole edilmiş Vue uygulaması örneği
[Lazy] // Görüntü alanına girince yükle
[TabSync] // Sekmeler arasında durumu senkronize et
<p><code>#[Url]</code> özelliği özellikle yararlıdır; arama sayfası sorguları, URL çubuğuna yansıtılır, böylece kullanıcılar arama sonuçları URL'lerini doğrudan paylaşabilir.</p>
<p><code>#[Lazy]</code> ve <code>placeholder()</code> birleştirildiğinde iskelet yükleme sağlar:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code>#[Lazy]
class HeavyChart extends Component { public function placeholder(): string { return ‘livue.chart-skeleton’; }
public function mount(): void
{
$this->data = DB::table('analytics')->get()->toArray();
}
}
<h2><a name="vue-ecosystem-integration" href="#vue-ecosystem-integration"></a>Vue Ekosistem Entegrasyonu</h2>
<p>LiVue'nın Livewire'a göre en büyük avantajı budur. Alt yapıda Vue 3 çalıştığı için, Vue eklentilerini doğrudan kullanabilirsiniz:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>import LiVue from 'livue';
<p>Pinia bulunur — yalnızca <code>import { defineStore } from 'pinia'</code> ile başlayın.</p>
<p>Client-side mantık için Blade şablonlarında <code>@script</code> kullanın:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>@script
<h2><a name="streaming-realtime-ai-output" href="#streaming-realtime-ai-output"></a>Streaming: Gerçek Zamanlı AI Çıkışı</h2>
<p>LiVue, NDJSON formatında yerleşik akış desteği sunar. Bu, LLM API'leriyle entegre etmek için kullanışlıdır:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code>class AiChat extends Component
{ use WithStreaming;
public function ask(string $question): void
{
foreach ($stream as $chunk) {
$this->stream(to: 'output', content: $chunk);
}
}