Ön Hazırlık ve Gereksinimler
Bu projeyi başarıyla tamamlamak için sisteminizde Laravel 11 veya üzeri bir sürümün kurulu olması gerekmektedir. Veri tutarlılığı için veritabanı işlemlerinde Eloquent ORM kullanacağız. Ayrıca, formlar arasındaki geçişleri yönetmek için Laravel'in yerleşik 'session' mekanizmasından yararlanacağız.
- PHP 8.3+ sürümü.
- Laravel 11.x framework.
- Composer paket yöneticisi.
- Temel düzeyde Blade şablon motoru bilgisi.
Adım 1: Form Verilerini Yönetmek İçin Controller Yapısı
Çok aşamalı bir formda verileri geçici olarak saklamak için bir Controller oluşturmalıyız. Bu Controller, her adımın doğrulanmasından ve verilerin oturumda tutulmasından sorumludur. Aşağıdaki örnekte, temel adımları yöneten bir yapı kuruyoruz.
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FormWizardController extends Controller
{
public function showStep(Request $request, $step)
{
$data = $request->session()->get('form_data', []);
return view("wizard.step{$step}", compact('data'));
}
public function postStep(Request $request, $step)
{
$validatedData = $request->validate([
// Adıma özel doğrulama kuralları buraya
]);
$data = $request->session()->get('form_data', []);
$request->session()->put('form_data', array_merge($data, $validatedData));
return redirect()->route('wizard.step', $step + 1);
}
}
Bu yapı, kullanıcının girdiği verileri form_data anahtarı altında oturumda birleştirir. Böylece kullanıcı bir sonraki adıma geçtiğinde önceki veriler kaybolmaz.
Adım 2: Dinamik Blade Şablonları Oluşturma
Her adım için ayrı bir Blade dosyası oluşturmak yerine, ortak bir düzen (layout) kullanmak kod tekrarını önler. Formun hangi adımda olduğunu belirlemek için gizli bir girdi alanı veya URL parametresi kullanabilirsiniz.
@csrf
İleri
Burada $data değişkeni, session'dan gelen verileri otomatik olarak form alanlarına doldurarak kullanıcının geri döndüğünde verilerini görmesini sağlar.
Adım 3: Veri Doğrulama ve Güvenlik
Çok aşamalı formlarda en büyük risk, kullanıcının doğrulanmamış veriyi doğrudan veritabanına göndermeye çalışmasıdır. Her adımda mutlaka FormRequest sınıflarını kullanmanızı öneririm.
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StepOneRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email',
];
}
}
Bu yaklaşım, SQL Injection ve XSS saldırılarına karşı Laravel'in sunduğu korumayı en üst seviyeye çıkarır. Kullanıcı girdileri her adımda temizlenir.
Kritik Güvenlik Uyarısı: Session verilerini şifrelemeden hassas bilgiler (şifre, kredi kartı vb.) saklamayın. Eğer çok aşamalı formunuzda hassas veriler varsa, bunları veritabanında geçici bir tabloda tutmak ve sadece tamamlandığında ana tabloya taşımak daha güvenlidir.
Adım 4: Form Sihirbazı Yöntemlerinin Karşılaştırılması
Aşağıdaki tablo, çok aşamalı form yönetimi için kullanılan farklı yaklaşımların avantaj ve dezavantajlarını özetlemektedir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Session Tabanlı | Kolay kurulum, hızlı geliştirme. | Büyük verilerde session boyutu sorunu. |
| Veritabanı Tabanlı | Güvenli, kalıcı, büyük veri desteği. | Daha fazla veritabanı sorgusu. |
| Client-Side (JS) | Sunucu yükü yok, hızlı geçiş. | Güvenlik açığı, doğrulama zorluğu. |
Adım 5: İşlemi Tamamlama ve Veritabanına Yazma
Tüm adımlar geçildikten sonra, oturumdaki verileri kalıcı hale getirmemiz gerekir. Son adımda session()->forget('form_data') komutu ile geçici verileri temizlemeyi unutmayın.
public function finalize(Request $request)
{
$data = $request->session()->get('form_data');
// Veriyi güvenli bir şekilde kaydet
User::create($data);
// Oturumu temizle
$request->session()->forget('form_data');
return redirect()->route('home')->with('success', 'İşlem başarıyla tamamlandı.');
}
Bu kod bloğu, tüm adımları birleştiren nihai işlemdir. User::create metodu, Laravel'in Mass Assignment (kütle atama) koruması sayesinde yalnızca $fillable dizisindeki alanların veritabanına yazılmasını sağlar.
Sıkça Sorulan Sorular
Çok aşamalı formlarda kullanıcı sayfayı yenilerse veriler silinir mi?
Eğer verileri oturumda (session) tutuyorsanız, sayfa yenilense bile veriler kaybolmaz. Ancak tarayıcı kapatılırsa oturum süresine bağlı olarak veriler temizlenebilir.
Doğrulama hatalarını nasıl gösteririm?
Laravel'in $errors değişkenini kullanarak Blade şablonlarınızda her adımda hata mesajlarını otomatik olarak listeleyebilirsiniz.
Adımlar arasında veri geçişini nasıl daha güvenli yaparım?
Her adımda verileri session'a yazarken, verinin doğruluğunu kontrol eden bir ara katman (middleware) kullanabilirsiniz.
Aynı anda birden fazla kullanıcı form doldurursa karışıklık olur mu?
Hayır, Laravel session'ları kullanıcı bazlı (session ID) yönettiği için veriler birbirine karışmaz.
Formu veritabanına kaydetmeden önce önizleme nasıl yapılır?
Son adımdan önce bir "Özet" sayfası oluşturarak, session'daki verileri bir tablo içinde kullanıcıya gösterebilir ve onay alabilirsiniz.
Sorumluluk Reddi: Bu rehberde sunulan kod örnekleri genel yazılım geliştirme prensiplerine dayanmaktadır. Üretim ortamında (production) kullanmadan önce mutlaka birim testleri (unit tests) yazmalı ve güvenlik taramalarından geçirmelisiniz.
İleri Seviye Optimizasyon: Form Verilerini Redis ile Yönetmek
Çok aşamalı formlarda session tabanlı veri saklama, kullanıcı trafiği arttığında sunucu üzerindeki dosya veya veritabanı yükünü artırabilir. Özellikle uzun süreli formlarda verilerin daha hızlı erişilebilir olması için Redis gibi bir in-memory (bellek içi) veri deposu kullanmak performansı ciddi oranda artırır. Laravel'de bunu yapmak oldukça kolaydır.
config/session.php dosyanızda sürücüyü redis olarak değiştirerek, tüm form verilerinin disk yerine RAM üzerinde tutulmasını sağlayabilirsiniz. Ayrıca, çok büyük form verileriyle çalışıyorsanız, verileri serialize ederek veya JSON formatında sıkıştırarak saklamak bellek kullanımını optimize eder.
// Veriyi Redis üzerinde daha optimize saklamak için örnek
public function storeStep(Request $request, $step)
{
$data = $request->validated();
$formKey = 'form_data_' . auth()->id();
// Mevcut veriyi al, güncelle ve tekrar kaydet
$existingData = Cache::get($formKey, []);
$updatedData = array_merge($existingData, $data);
Cache::put($formKey, $updatedData, now()->addMinutes(30));
return redirect()->route('form.step', $step + 1);
}
Form Süreçlerinde Hata Ayıklama (Debugging) ve Loglama
Çok aşamalı formlar, kullanıcıların adımlar arasında gezinirken beklenmedik hatalarla karşılaşabileceği karmaşık yapılardır. Hataları izlemek için sadece kullanıcıya mesaj göstermek yeterli değildir; arka planda hangi adımda veya hangi veride hata oluştuğunu loglamanız gerekir.
Laravel'in Log facade'ını kullanarak, her adım geçişinde verilerin durumunu izleyebilirsiniz. Bu, özellikle "kullanıcı verim silindi" gibi şikayetlerin kaynağını bulmada kritik rol oynar.
use Illuminate\Support\Facades\Log;
public function handleStep(Request $request, $step)
{
try {
// İş mantığı
} catch (\Exception $e) {
Log::error('Form Adım Hatası:', [
'user_id' => auth()->id(),
'step' => $step,
'message' => $e->getMessage(),
'input' => $request->except(['password', 'password_confirmation'])
]);
return back()->withErrors(['error' => 'Bir hata oluştu, lütfen tekrar deneyin.']);
}
}
Kullanıcı Deneyimini İyileştiren İpuçları
- Otomatik Kaydetme (Auto-save): Kullanıcı formu doldururken her input değişiminde AJAX ile veriyi arka planda kaydedin. Böylece tarayıcı kapansa bile veri kaybolmaz.
- İlerleme Çubuğu (Progress Bar): Kullanıcının hangi aşamada olduğunu görselleştiren bir yüzde çubuğu, form tamamlama oranını (conversion rate) artırır.
- Geri Dönüş Butonu: Kullanıcılara önceki adımlara dönüp verilerini düzenleme imkanı mutlaka tanıyın.
- Input Maskeleme: Telefon, tarih veya TC kimlik numarası gibi alanlarda maskeleme kullanarak hatalı veri girişini en baştan engelleyin.
Profesyonel İpucu: Eğer formunuz çok fazla adım içeriyorsa (10+ adım), veritabanında bir drafts tablosu oluşturun. Session yerine bu tabloyu kullanmak, formun günler süren bir süreçte bile kaldığı yerden devam etmesini sağlar.
Sonuç
Laravel ile dinamik bir çok aşamalı form sihirbazı oluşturmak, doğru bir mimari ile oldukça basit ve yönetilebilirdir. Oturum yönetimi, FormRequest sınıfları ve veritabanı işlemlerini doğru kurgulayarak kullanıcı dostu deneyimler sunabilirsiniz. Bir sonraki adım olarak, bu form yapısını Livewire gibi modern araçlarla daha interaktif hale getirmeyi deneyebilirsiniz. İyi kodlamalar!


Yorumlar (0)
Yorum Yaz