İçeriğe geç
Muhammet Şafak
Framework & Kütüphane 3 dk okuma

Inertia.js ile monolitten modern arayüze

Inertia.js'in ayrı bir API yazmadan SPA hissi verme modelini, Laravel ile entegrasyonunu ve ne zaman doğru seçim olduğunu anlatıyorum.


Bir monolitik Laravel uygulamasını modern bir arayüze taşımak istediğinizde iki seçenek var gibi görünüyor: ya Blade şablonlarında kalmak ya da ayrı bir SPA yazıp API üzerinden bağlamak. İlki bilinen yol; ikincisi büyük bir maliyet — iki ayrı kod tabanı, iki ayrı kimlik doğrulama mekanizması, API sürümleme kararları, deployment karmaşası.

Inertia.js bu iki uç arasında üçüncü bir yol sunuyor. Monolit kalıyor, ama arayüz Vue veya React ile yazılıyor. API tasarlamaya gerek yok.

Inertia nasıl çalışır?

Inertia, sayfa geçişlerini intercept ediyor. Normal bir bağlantıya tıkladığınızda tarayıcı sunucuya istek atıyor; Inertia bu isteği yakalıyor ve JSON formatında sayfa bileşenini ve verisini alıyor. Tam sayfa yenilenmesi olmuyor, Vue bileşeni yerinde güncelleniyor.

Sunucu tarafında bir Inertia::render() çağrısı yeterli:

// app/Http/Controllers/PostController.php
use Inertia\Inertia;

class PostController extends Controller
{
    public function index()
    {
        $posts = Post::with('user')
            ->latest()
            ->paginate(15);

        return Inertia::render('Posts/Index', [
            'posts' => $posts,
        ]);
    }

    public function show(Post $post)
    {
        return Inertia::render('Posts/Show', [
            'post' => $post->load('comments.user'),
        ]);
    }
}

İstemci tarafında Posts/Index bir Vue bileşeni; props olarak posts geliyor:

<template>
  <div>
    <article v-for="post in posts.data" :key="post.id">
      <h2>{{ post.title }}</h2>
      <p>{{ post.user.name }}</p>
    </article>

    <Pagination :links="posts.links" />
  </div>
</template>

<script>
export default {
  props: {
    posts: Object,
  },
};
</script>

Kimlik doğrulama, middleware, oturum — bunların tamamı Laravel’in kendi mekanizmaları. Ekstra bir şey kurmanıza gerek yok.

API yazmak zorunda değilsiniz — ama bu bir sınır da

Inertia’nın “API yok” modeli bazı durumları dışarıda bırakıyor. Aynı API’yi başka bir mobil uygulama ya da üçüncü taraf istemci tüketecekse Inertia uygun değil; o zaman gerçekten ayrı bir API yazmanız gerekiyor. Inertia web arayüzüyle aynı Laravel uygulamasını paylaşan tek bir istemci için tasarlanmış.

Bir trade-off daha: sunucu ile istemci birbirine sıkıca bağlı. Bileşen adları, prop yapıları Laravel controller’larında tanımlı. Frontend bağımsız evrim geçiremiyor. Bu bazı takımlar için sorun değil; bazıları için kabul edilemez.

Shared data ile global veri aktarımı

Her sayfada tekrarlanan veriyi — kimlik doğrulanmış kullanıcı, flash mesajları, global ayarlar — her controller’da ayrı ayrı geçirmek gereksiz. Inertia’nın share() mekanizması bunu çözüyor:

// app/Http/Middleware/HandleInertiaRequests.php
public function share(Request $request): array
{
    return array_merge(parent::share($request), [
        'auth' => [
            'user' => $request->user(),
        ],
        'flash' => [
            'success' => $request->session()->get('success'),
            'error'   => $request->session()->get('error'),
        ],
    ]);
}

Bu veriler her Inertia yanıtına otomatik ekleniyor; bileşenlerde $page.props.auth.user ile erişilebilir. Laravel’deki View::share() mantığının Inertia karşılığı bu.

Blade’den Inertia’ya geçiş stratejisi

Mevcut bir Laravel + Blade projesini tamamen değiştirmeden Inertia’ya geçmek mümkün. İki sistem paralel çalışabiliyor: bazı rotalar Blade döndürürken bazıları Inertia::render döndürüyor. Kademeli geçiş için bu önemli.

Bir ekrandan başlamak, orada Inertia’nın nasıl çalıştığını görmek ve takımın alışmasını beklemek daha güvenli bir yol. Tüm uygulamayı bir günde geçirmek gereksiz risk.

Livewire ile karşılaştırma

Bu yıl hem Livewire hem de Inertia’yı projelerde kullandım. Fark şu:

Livewire backend odaklı ekipler için tasarlanmış — JavaScript minimum, sunucu render hâkim. Inertia frontend geliştiricisinin sahada olduğu durumlar için daha iyi — tam Vue/React kabiliyetleri kullanılıyor.

Proje bir form ağırlıklı yönetim paneliyse Livewire daha az bileşen yazmamı sağlıyor. Proje karmaşık istemci tarafı etkileşimleri içeriyorsa ya da Vue yazabilecek biri varsa Inertia daha doğal hissettiriyor.


Inertia, monolit-SPA tartışmasında keskin bir pozisyon alıyor: büyük ölçekte değil, tek istemci senaryosunda mükemmel bir denge. API tasarlamak gereksiz zaman kaybı gibi hissedilen, ama Blade’in artık yeterli olmadığı noktada tam olarak doğru araç.

Etiketler: #Laravel#Inertia.js
Paylaş:

İlgili Yazılar

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi