Wayfinder
Laravel Wayfinder Laravel route'larından ve controller'larından tip-güvenli TypeScript fonksiyonları üretir. Starter kit vite plugin'i hazır bağlı gelir — frontend kodu hardcoded URL string'leri yerine bu üretilmiş fonksiyonları çağırmalıdır.
Üretim nasıl çalışır
routes/web/*.php ──┐
routes/api/*.php │ wayfinder() vite plugin
app/Http/Controllers/**.php │ (dev + build sırasında çalışır)
▼
resources/js/actions/**/*.ts ← controller'lar (Action tarzı)
resources/js/routes/**/*.ts ← isimli route'lar
resources/js/wayfinder/*.ts ← üretilen metadata
Yeniden üretim npm run dev ve npm run build ile otomatik. Manuel üretim:
php artisan wayfinder:generate
Üretilen route'ları kullanmak
Her isimli route tipli bir fonksiyona dönüşür. Route::get('/admin/users/dt', …)->name('admin.users.dtApi') için:
import users from '@/routes/users';
// Sadece URL — <a :href> veya üçüncü parti kütüphaneler için
const dtUrl: string = users.dtApi.url();
// İstek nesneleri üret
users.dtApi.get(); // { url: '/admin/users/dt', method: 'get' }
users.store.post({ name: 'Ali' }); // { url: '/admin/users', method: 'post', data: {…} }
Tipli fonksiyonları route prop'u alan bileşenlerle kullan:
<script setup lang="ts">
import { DB } from '@lvntr/components/DatatableBuilder/core';
import users from '@/routes/users';
const tableConfig = DB.table<UserRow>()
.route(users.dtApi.url()) // <-- hardcoded path yok
.build();
</script>
Üretilen controller action'larını kullanmak
Route::…->uses([Controller::class, 'method']) veya tek-action invokable'lar da @/actions altında fonksiyon oluşturur:
import UserController from '@/actions/App/Http/Controllers/Admin/UserController';
await useApi().post(UserController.store.url(), { name: 'Ali' });
İsimli route varsa @/routes/… tercih et — action'lar isimsiz route'lar için yedektir.
Query parametreleri ve route model binding
Query parametreleri tiplidir:
users.index.url({ query: { status: 'active', type: 'admin' } });
// → '/admin/users?status=active&type=admin'
Route model binding de aynı:
// Route::get('/admin/users/{user}', …)->name('admin.users.show')
users.show.url({ user: 42 }); // '/admin/users/42'
users.show.url({ user: user.id });
Inertia form submission
Wayfinder fonksiyonları Inertia form helper'ına doğrudan takılır:
import { useForm } from '@inertiajs/vue3';
import users from '@/routes/users';
const form = useForm({ name: '', email: '' });
function submit() {
form.submit(users.store);
}
API akışları için SkForm'un built-in submission'ı veya useApi() tercih edilmeli — ikisi de route descriptor'ı doğrudan kabul eder.
Tree-shaking ve bundle boyutu
Wayfinder çıktısı tamamen tree-shakable — sadece bileşenlerinin import ettiği route/action'lar tarayıcıya gider. Barrel dosyadan toplu re-export yapma; Vite'ın kullanılmayan girişleri atabilmesi için spesifik route modülünden import et (@/routes/users).
Wayfinder'ı ne zaman kullanma
- Statik asset URL'leri (
/favicon.ico,/storage/…) — string literal kullan. - Harici API'ler — Wayfinder yalnızca bu Laravel uygulamasındaki route'ları bilir.
- SSR zamanında string'e ihtiyacın olan PrimeVue DataTable
exportUrlgibi durumlarda —.url()'yi bir kez çağır, string'i aşağıya taşı.
Sorun giderme
Module not found: @/routes/foo— Route adı yok veya üretim henüz çalışmadı.npm run devbaşlat veyaphp artisan wayfinder:generateçalıştır.- TypeScript eksik param hatası — Wayfinder route pattern'inde tanımlı param'ları ister. İlk argümanda geç:
users.show.url({ user: 42 }). - Route yeniden adlandırıldıktan sonra tipler eski kalıyor —
resources/js/wayfinder/veresources/js/routes/klasörlerini sil, sonra yeniden üret. Tamamen türetilmiş dosyalardır.