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 sisteminizde PHP 8.2 veya üzeri bir sürümün ve Laravel 11.x veya güncel bir sürümünün kurulu olması gerekmektedir. Projenizin kurulu olduğu dizinde terminali açarak gerekli bağımlılıkların yüklü olduğundan emin olun.

  • PHP 8.2+ ve Composer kurulu bir ortam.
  • Laravel Framework (11.x sürümü baz alınmıştır).
  • Temel düzeyde MVC (Model-View-Controller) mimarisi bilgisi.
  • Veritabanı bağlantısı yapılandırılmış bir proje ortamı.

Laravel Form Request Sınıfları ile Temel Doğrulama

Laravel'de doğrulama mantığını Controller içerisinden ayırmak, kodun okunabilirliğini artırır. Form Request sınıfları, belirli bir isteğin doğrulanmasından sorumlu olan özel sınıflardır. İlk adım olarak, terminal üzerinden bir Form Request oluşturalım.

php artisan make:request StoreUserRequest

Bu komut, app/Http/Requests dizini altında yeni bir sınıf oluşturur. Şimdi bu sınıfın içerisinde temel doğrulama kurallarımızı tanımlayalım.

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true; // İstek yetkilendirmesi
    }

    public function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
            'age' => 'required|integer|min:18',
        ];
    }
}

Bu yapı, gelen verilerin belirtilen kriterlere uygun olup olmadığını otomatik kontrol eder. Eğer bir kural ihlal edilirse, Laravel kullanıcıyı otomatik olarak bir önceki sayfaya hata mesajlarıyla birlikte yönlendirir.

Dinamik Doğrulama Kuralları Oluşturma

Statik kurallar her zaman yeterli olmayabilir. Örneğin, kullanıcının seçtiği bir role göre formdaki diğer alanların zorunlu olup olmadığını değiştirmek isteyebilirsiniz. Dinamik doğrulama için rules() metodu içerisinde mantıksal koşullar kurabiliriz.

public function rules(): array
{
    $rules = [
        'name' => 'required|string',
    ];

    if ($this->has('is_company')) {
        $rules['company_name'] = 'required|string|max:100';
    } else {
        $rules['personal_id'] = 'required|digits:11';
    }

    return $rules;
}

Bu yöntem, formdaki is_company değerine bağlı olarak company_name veya personal_id alanlarını dinamik olarak zorunlu hale getirir. Bu, karmaşık form yapılarında esneklik sağlar.

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

Aşağıdaki tablo, dinamik doğrulama yaparken kullanabileceğiniz farklı yöntemlerin avantajlarını ve kullanım senaryolarını özetlemektedir.

Yöntem Avantajı Dezavantajı
Form Request Temiz kod, merkezi yönetim Dinamiklik bazen karmaşıklaşabilir
Controller Validation Hızlı ve basit prototipleme Controller'ı şişirir
Validator Facade Tam kontrol, koşullu mantık Daha fazla manuel kod yazımı

Validator Facade ile Koşullu Doğrulama

Bazen Form Request sınıfları yerine Controller içerisinde daha spesifik bir doğrulama yapmanız gerekebilir. Validator sınıfı, çalışma zamanında kural setleri oluşturmanıza olanak tanır.

use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'type' => 'required|in:individual,corporate',
    ]);

    $validator->sometimes('tax_number', 'required|numeric', function ($input) {
        return $input->type === 'corporate';
    });

    if ($validator->fails()) {
        return response()->json($validator->errors(), 422);
    }
}

sometimes metodu, belirli bir koşul gerçekleştiğinde kuralı devreye sokar. Bu, özellikle API geliştirme süreçlerinde dinamik veri setlerini yönetmek için oldukça güçlü bir araçtır.

Güvenlik Uyarısı: Doğrulama kurallarını asla yalnızca istemci tarafında (JavaScript) yapmayın. Her zaman sunucu tarafında (Laravel) doğrulamayı zorunlu kılın. Kullanıcıdan gelen verileri veritabanına işlemeden önce mutlaka temizleyin ve "Mass Assignment" (Toplu Atama) saldırılarına karşı Model'lerinizde $fillable dizisini doğru yapılandırın.

Hata Mesajlarını Özelleştirme ve Yönetme

Dinamik doğrulama yaparken hata mesajlarının da bağlama uygun olması gerekir. Laravel'de messages() metodunu kullanarak hata mesajlarını özelleştirebilirsiniz.

public function messages(): array
{
    return [
        'company_name.required' => 'Kurumsal hesap seçtiyseniz şirket adını girmelisiniz.',
        'personal_id.digits' => 'TC Kimlik numarası 11 haneli olmalıdır.',
    ];
}

Bu özelleştirme, kullanıcı deneyimini doğrudan iyileştirir ve hataların neden kaynaklandığını net bir şekilde açıklar.

Sıkça Sorulan Sorular

Dinamik doğrulama kuralları performansı etkiler mi?

Doğru yapılandırıldığında performans etkisi ihmal edilebilir düzeydedir. Ancak, veritabanı sorgusu gerektiren (unique, exists gibi) kuralları çok fazla dinamik koşul içine gömmekten kaçınmalısınız.

Form Request sınıfında veritabanına nasıl erişirim?

Form Request sınıfı içerisinde $this->input('key') diyerek gelen veriye erişebilir ve bu veriyi kullanarak veritabanı sorguları (örneğin Rule::exists()) oluşturabilirsiniz.

Doğrulama hatası aldığımda veriyi nasıl korurum?

Laravel, doğrulama hatası sonrası kullanıcıyı yönlendirirken old() fonksiyonu ile girilen verileri formda tutar. value="{{ old('name') }}" kullanımı ile bu verileri inputlara geri basabilirsiniz.

API projelerinde dinamik doğrulama nasıl yapılır?

API projelerinde ValidationException yakalanarak JSON formatında hata dönülür. Form Request sınıfları API'lerde de aynı şekilde çalışır ve otomatik 422 hata kodu üretir.

Custom (Özel) doğrulama kuralı nasıl eklenir?

php artisan make:rule komutu ile özel kurallar oluşturabilir ve bunları dinamik olarak rules() dizisine dahil edebilirsiniz.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce her zaman kendi güvenlik testlerinizi yapın ve hassas verilerin doğrulanmasında en güncel Laravel güvenlik dokümantasyonunu takip edin.

Dinamik Doğrulama Süreçlerinde Hata Ayıklama ve Loglama

Dinamik doğrulama kuralları, çalışma zamanında (runtime) oluşturulduğu için bazen beklenmedik sonuçlar doğurabilir. Özellikle karmaşık iç içe geçmiş (nested) dizilerde hangi kuralın tetiklendiğini veya neden başarısız olduğunu anlamak için Laravel'in hata ayıklama araçlarını etkin kullanmalısınız.

Doğrulama sürecini izlemek için Validator nesnesini bir değişkene atayarak failed() metodunu kullanabilirsiniz. Bu yöntem, hangi alanın hangi kuraldan dolayı hata verdiğini detaylı bir şekilde görmenizi sağlar.

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

if ($validator->fails()) {
    // Hangi kuralın başarısız olduğunu loglayalım
    Log::error('Doğrulama hatası:', [
        'errors' => $validator->errors()->toArray(),
        'failed_rules' => $validator->failed()
    ]);

    return response()->json($validator->errors(), 422);
}

Bu yaklaşım, özellikle API tabanlı projelerde istemciye gönderilen hata mesajlarının yanı sıra, sunucu tarafında da hata kaynağını hızlıca tespit etmenize olanak tanır. $validator->failed() metodu, başarısız olan alanları ve bu alanlara uygulanan kural isimlerini anahtar-değer çifti olarak döndürür.

Dinamik Doğrulamada Performans Optimizasyonu

Dinamik kurallar oluştururken veritabanı sorgularını (örneğin exists veya unique kuralları) rules() metodu içerisinde döngüye sokmak, büyük veri setlerinde performans kaybına yol açabilir. Performansı artırmak için şu stratejileri izleyebilirsiniz:

  • Önbellekleme (Caching): Eğer doğrulama kurallarınız veritabanındaki sabit bir konfigürasyondan geliyorsa, bu kuralları Cache::remember() ile belleğe alın.
  • Sorgu Sayısını Azaltma: Döngü içerisinde her alan için ayrı bir sorgu çalıştırmak yerine, verileri toplu olarak (batch) çekip dizi üzerinde kontrol yapın.
  • Lazy Evaluation: Eğer kural karmaşık bir mantık gerektiriyorsa, Closure kullanarak sadece ihtiyaç duyulduğunda çalışmasını sağlayın.

Aşağıdaki örnekte, veritabanından gelen kuralların nasıl önbellekleneceği gösterilmiştir:

public function rules()
{
    return Cache::remember('form_rules_' . $this->form_id, 3600, function () {
        $fields = Field::where('form_id', $this->form_id)->get();
        $rules = [];
        
        foreach ($fields as $field) {
            $rules[$field->name] = $field->validation_rules;
        }
        
        return $rules;
    });
}

Bu yöntemle, her istekte veritabanına gidilmesini engelleyerek uygulamanızın yanıt süresini milisaniyeler seviyesinde iyileştirebilirsiniz. Özellikle yoğun trafik alan formlarda bu optimizasyon hayati önem taşır.

Sonuç

Laravel ile dinamik form verisi doğrulama sistemi kurmak, uygulamanızın veri bütünlüğünü korumanın en etkili yoludur. Form Request sınıflarının sunduğu modüler yapı, Validator Facade'in sağladığı esneklik ve özelleştirilebilir hata mesajları ile kullanıcı dostu bir deneyim sunabilirsiniz. Bir sonraki adım olarak, kendi özel doğrulama kurallarınızı (Custom Rules) oluşturmayı ve bunları projenizin genelinde nasıl yeniden kullanabileceğinizi araştırmanızı öneririm.

Bu yazıya tepkinizi paylaşın:
Emre Cansever

Teknik rehberler ve kendin yap (DIY) projeleri üzerine yoğunlaşıyorum. Detaylı ve güvenilir içerikler hazırlayarak okuyucuların teknik sorunlarını çözmelerine yardımcı oluyorum.

Yorumlar (0)

Yorum Yaz