Laravel İle Dinamik Bir Form Verisi Doğrulama Sistemi Nasıl Yapılır?

Laravel İle Dinamik Bir Form Verisi Doğrulama Sistemi Nasıl Yapılır?
Laravel İle Dinamik Bir Form Verisi Doğrulama Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu rehberdeki uygulamaları gerçekleştirebilmek için bilgisayarınızda Laravel 11 veya üzeri bir sürümün yüklü olması gerekmektedir. Projenizin çalışması için PHP 8.2+ sürümü ve Composer paket yöneticisi zorunludur. Projenizi oluşturmak için terminalde aşağıdaki komutu kullanabilirsiniz:

composer create-project laravel/laravel dinamik-dogrulama

Kurulum tamamlandıktan sonra, veritabanı bağlantı ayarlarınızı .env dosyasından yapılandırmayı unutmayın. Dinamik doğrulama sistemi için herhangi bir ek paket yüklemenize gerek yoktur; Laravel'in çekirdek özellikleri bu işlem için fazlasıyla yeterlidir.

Form Request Sınıfları ile Doğrulama Mantığını Ayrıştırma

Laravel'de doğrulama mantığını Controller içinde tutmak yerine, "Form Request" sınıflarını kullanmak en iyi pratiktir. Bu sınıflar, doğrulama kurallarını ve yetkilendirme mantığını merkezi bir yerde toplar. İlk adım olarak, terminal üzerinden bir Form Request sınıfı oluşturalım:

php artisan make:request StoreDynamicRequest

Oluşturulan bu sınıf, app/Http/Requests dizini altında yer alır. Burada rules() metodu içerisinde doğrulama kurallarını tanımlayacağız. Dinamik doğrulama için bu metodu çalışma anında değiştirebiliriz.

Dinamik Doğrulama Kuralları Oluşturma

Dinamik doğrulama, formun içeriğine veya kullanıcının durumuna göre kuralların değişmesi anlamına gelir. Örneğin, bir kullanıcının seçtiği "kategori"ye göre formdaki diğer alanların zorunlu olup olmadığını belirleyebiliriz. İşte StoreDynamicRequest sınıfı içerisinde dinamik kural tanımlama örneği:

public function rules(): array
{
    $rules = [
        'ad' => 'required|string|max:255',
        'kategori' => 'required|in:teknik,genel',
    ];

    if ($this->kategori === 'teknik') {
        $rules['teknik_detay'] = 'required|min:10';
    }

    return $rules;
}

Bu kod bloğunda, kategori alanı "teknik" olarak seçildiğinde, teknik_detay alanı zorunlu hale getirilmiştir. Bu yaklaşım, karmaşık formlarda sunucu tarafında esnek bir kontrol mekanizması sağlar.

Özelleştirilmiş Hata Mesajları ve Yerelleştirme

Kullanıcıya sunulan hata mesajlarının anlaşılır olması, kullanıcı deneyimini (UX) doğrudan etkiler. Laravel, Form Request sınıfları içerisinde messages() metodunu kullanarak bu mesajları özelleştirmenize olanak tanır.

public function messages(): array
{
    return [
        'ad.required' => 'Lütfen adınızı giriniz.',
        'teknik_detay.required' => 'Teknik kategori seçtiğiniz için detayları belirtmelisiniz.',
    ];
}

Bu yöntemle, varsayılan İngilizce veya genel hata mesajları yerine, uygulamanızın tonuna uygun Türkçe hata mesajları tanımlayabilirsiniz. Hata mesajlarını lang/tr/validation.php dosyası üzerinden de yönetebilirsiniz, ancak spesifik formlar için bu sınıf içi yöntem daha pratiktir.

Doğrulama Yöntemlerinin Karşılaştırılması

Laravel'de doğrulama yapmanın farklı yolları vardır. İhtiyacınıza göre en uygun olanı seçmek için aşağıdaki tabloyu inceleyebilirsiniz:

Yöntem Avantajı Dezavantajı
Controller Validate Hızlı ve basit formlar için ideal. Controller'ı kirletir, tekrar kullanılmaz.
Form Request Temiz kod, merkezi yönetim, tekrar kullanılabilir. Küçük projelerde dosya sayısını artırır.
Validator Facade Tam kontrol sağlar, karmaşık mantıklar için uygundur. Manuel yönetim gerektirir.

Güvenlik ve Veri Filtreleme

Doğrulama sadece verinin biçimini kontrol etmek değildir, aynı zamanda güvenlik önlemidir. Kullanıcıdan gelen veriyi doğrudan veritabanına kaydetmeden önce mutlaka "Mass Assignment" (Toplu Atama) koruması kullanmalısınız. Modelinizde $fillable dizisini tanımlamak, SQL Injection ve istenmeyen veri girişlerini engellemek için ilk adımdır.

Kritik Güvenlik Uyarısı: Doğrulama kurallarınızda asla kullanıcıdan gelen veriye doğrudan güvenmeyin. Her zaman validated() metodunu kullanarak sadece doğrulanmış veriyi işleyin. Ayrıca, dosya yükleme işlemlerinde mimes ve max kurallarını mutlaka kullanın.
public function store(StoreDynamicRequest $request)
{
    // Sadece doğrulanmış veriyi al
    $validated = $request->validated();

    // Veriyi güvenli bir şekilde kaydet
    Post::create($validated);

    return back()->with('success', 'İşlem başarıyla tamamlandı.');
}

Sıkça Sorulan Sorular

Form Request sınıfları neden Controller'dan daha iyidir?

Form Request sınıfları, doğrulama mantığını Controller'dan ayırarak "Single Responsibility Principle" (Tek Sorumluluk İlkesi) prensibine uyum sağlar. Bu sayede Controller'larınız daha temiz kalır ve doğrulama kuralları başka yerlerde de tekrar kullanılabilir.

Dinamik kurallarda veritabanı sorgusu yapabilir miyim?

Evet, rules() metodu içerisinde exists veya unique gibi kuralları kullanarak veritabanı kontrolleri yapabilirsiniz. Ancak, çok yoğun sorgulardan kaçınmak için performans optimizasyonuna dikkat etmelisiniz.

Doğrulama hatası olduğunda kullanıcıyı nasıl geri yönlendirebilirim?

Laravel, Form Request kullandığınızda doğrulama başarısız olursa otomatik olarak kullanıcıyı bir önceki sayfaya hata mesajlarıyla birlikte yönlendirir. Ekstra bir yönlendirme kodu yazmanıza gerek yoktur.

Dinamik form alanlarını nasıl yönetirim?

Dinamik olarak artan alanlar için (örneğin bir dizi veri), array doğrulama kuralını kullanabilir ve ad.* şeklinde alt alanları kontrol edebilirsiniz.

API projelerinde doğrulama nasıl çalışır?

API projelerinde de Form Request kullanabilirsiniz. Eğer doğrulama başarısız olursa, Laravel otomatik olarak 422 Unprocessable Entity yanıtı döner ve hataları JSON formatında sunar.

Dinamik Doğrulama Süreçlerinde Performans Optimizasyonu

Dinamik doğrulama kuralları, özellikle veritabanı sorgularının yoğun olduğu senaryolarda uygulamanın tepki süresini etkileyebilir. exists veya unique gibi kurallar, her istekte veritabanına ek sorgu gönderilmesine neden olur. Bu yükü minimize etmek için aşağıdaki stratejileri izleyebilirsiniz:

  • Önbellekleme (Caching): Doğrulama kurallarınızın bir kısmı statikse veya sık değişmeyen veritabanı değerlerine bağlıysa, bu değerleri Cache mekanizması ile bellekte tutun.
  • Sorgu Optimizasyonu: Rule::unique() kullanırken, sorguyu daraltmak için where koşullarını mutlaka ekleyin. Bu, veritabanı indekslerinin daha verimli kullanılmasını sağlar.
// Optimize edilmiş benzersizlik kontrolü
Rule::unique('users', 'email')->where(function ($query) {
    return $query->where('status', 'active');
})->ignore($this->user()->id);

Dinamik Doğrulama Mantığını Test Etme

Dinamik yapılar, statik kurallara göre daha fazla hata payı içerir. Bu nedenle, yazdığınız FormRequest sınıflarını veya doğrulama mantığını birim testleri (unit tests) ile doğrulamak kritik öneme sahiptir. Laravel'in sunduğu assertSessionHasErrors metodu, doğrulama mantığınızın beklediğiniz gibi çalışıp çalışmadığını test etmenizi sağlar.

Aşağıdaki örnek, dinamik bir formun boş gönderildiğinde hata verip vermediğini test eden bir senaryodur:

public function test_dynamic_form_validation_fails_when_empty()
{
    $response = $this->post('/submit-form', []);

    $response->assertSessionHasErrors([
        'dynamic_field_1', 
        'dynamic_field_2'
    ]);
}

Hata Ayıklama (Debugging) İpuçları

Dinamik doğrulama kurallarında hata ayıklamak bazen zorlayıcı olabilir. Hatanın nerede oluştuğunu anlamak için Validator nesnesini manuel olarak oluşturup errors() metodunu incelemek en hızlı yöntemdir:

$validator = Validator::make($request->all(), $rules);

if ($validator->fails()) {
    // Hataları log dosyasına yazdırarak inceleyin
    Log::error('Doğrulama hatası:', $validator->errors()->toArray());
    return response()->json($validator->errors(), 422);
}

İleri Seviye: Koşullu Doğrulama (Conditional Validation)

Bazen bir alanın doğrulanması, başka bir alanın değerine bağlıdır. Laravel'in required_if veya required_unless kuralları yerine, çok daha karmaşık mantıklar için Rule::when yapısını kullanmak kodunuzu çok daha temiz kılar.

$rules = [
    'payment_method' => 'required|in:credit_card,bank_transfer',
    'card_number' => Rule::when($request->payment_method === 'credit_card', ['required', 'digits:16']),
];

Bu yaklaşım, FormRequest sınıfınızın içindeki rules() metodunu gereksiz if-else bloklarından kurtararak, deklaratif ve okunabilir bir yapı sunar.

Sonuç

Laravel ile dinamik bir form doğrulama sistemi kurmak, uygulamanızın hem güvenliğini artırır hem de kodunuzun okunabilirliğini yükseltir. Form Request sınıflarını ve dinamik kural oluşturma yöntemlerini kullanarak, her türlü karmaşık kullanıcı girişini yönetebilirsiniz. Bir sonraki adım olarak, bu doğrulama sistemini "Policy" (Yetkilendirme) sınıfları ile birleştirerek kullanıcı yetkilerini de kontrol eden daha kapsamlı bir yapı kurmayı deneyebilirsiniz. Başarılı kodlamalar dilerim.

Yasal Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Uygulamanızın üretim ortamında (production) güvenliğini sağlamak için her zaman güncel güvenlik yamalarını takip edin ve kullanıcı girdilerini temizleme (sanitization) süreçlerini ihmal etmeyin.
Bu yazıya tepkinizi paylaşın:
Selin Demir

Sürdürülebilir yaşam ve kişisel verimlilik üzerine odaklanan bir içerik üreticisiyim. Zaman yönetimi ve organizasyonel ipuçları konusunda okuyuculara yol gösteriyorum.

Yorumlar (0)

Yorum Yaz