Laravel İle Özelleştirilmiş Bir Veri Doğrulama Kuralı Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu rehberi takip edebilmek için sisteminizde aşağıdaki bileşenlerin yüklü olması gerekmektedir:

  • PHP 8.2 veya üzeri bir sürüm.
  • Laravel 11.x veya 12.x framework kurulumu.
  • Composer paket yöneticisi.
  • Temel düzeyde PHP nesne yönelimli programlama (OOP) bilgisi.

Projelerinizde doğrulama mantıklarını merkezi bir noktada tutmak, kodunuzun sürdürülebilirliğini artırır. Şimdi, terminal üzerinden Laravel'in sunduğu artisan komutlarını kullanarak ilk kuralımızı oluşturmaya başlayalım.

Adım 1: Artisan Komutu ile Kural Sınıfını Oluşturma

Laravel, özelleştirilmiş bir kural oluşturmak için make:rule komutunu sağlar. Bu komut, uygulamanızın app/Rules dizininde gerekli sınıf yapısını otomatik olarak oluşturur.

php artisan make:rule Uppercase

Bu komut, app/Rules/Uppercase.php dosyasını oluşturacaktır. Bu sınıf, Illuminate\Contracts\Validation\ValidationRule arayüzünü (interface) uygular ve doğrulama mantığını burada tanımlarız.

Adım 2: Doğrulama Mantığını Yazma

Oluşturduğumuz sınıfın içindeki validate metodunu düzenleyerek kuralımızı tanımlayalım. Bu örnekte, girilen verinin tamamen büyük harflerden oluşup oluşmadığını kontrol eden bir kural yazacağız.

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class Uppercase implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (strtoupper($value) !== $value) {
            $fail('The :attribute must be uppercase.');
        }
    }
}

Burada $fail closure'ı, doğrulama başarısız olduğunda hata mesajını döndürmek için kullanılır. :attribute ifadesi, Laravel tarafından otomatik olarak alanın adıyla değiştirilir.

Adım 3: Özelleştirilmiş Kuralı Controller İçerisinde Kullanma

Yazdığımız kuralı, bir form isteğini doğrulamak için Controller veya FormRequest sınıfı içerisinde kullanabiliriz. Aşağıda, standart bir Controller içinde bu kuralın nasıl çağrıldığını görebilirsiniz.

use App\Rules\Uppercase;
use Illuminate\Http\Request;

public function store(Request $request)
{
    $request->validate([
        'name' => ['required', 'string', new Uppercase],
    ]);
}

Bu kod bloğu, 'name' alanının zorunlu olduğunu, bir metin olduğunu ve bizim oluşturduğumuz Uppercase kuralına uyması gerektiğini belirtir. Eğer kural ihlal edilirse, Laravel otomatik olarak kullanıcıyı önceki sayfaya hata mesajıyla yönlendirir.

Adım 4: Closure Tabanlı Hızlı Kurallar

Eğer kuralınız çok basitse ve tekrar kullanılabilir olması gerekmiyorsa, ayrı bir sınıf oluşturmak yerine doğrudan Closure kullanarak doğrulama yapabilirsiniz. Bu, küçük projeler için oldukça hızlı bir yöntemdir.

$request->validate([
    'title' => [
        'required',
        function ($attribute, $value, $fail) {
            if (str_contains($value, 'badword')) {
                $fail('The '.$attribute.' contains forbidden words.');
            }
        },
    ],
]);

Bu yöntem, kuralın sadece tek bir noktada kullanılacağı durumlar için idealdir. Ancak karmaşık ve birden fazla yerde kullanılan mantıklar için Rule sınıfları tercih edilmelidir.

Adım 5: Veritabanı ile Etkileşimli Kurallar

Birçok durumda doğrulama yaparken veritabanındaki verileri kontrol etmeniz gerekir. Örneğin, bir kullanıcı adının daha önce alınıp alınmadığını veya belirli bir koşula sahip olup olmadığını kontrol edebilirsiniz.

public function validate(string $attribute, mixed $value, Closure $fail): void
{
    if (\App\Models\User::where('email', $value)->exists()) {
        $fail('Bu e-posta adresi zaten sistemde kayıtlı.');
    }
}

Bu örnekte, kural sınıfı içerisinde Eloquent ORM kullanarak veritabanı sorgusu yapıyoruz. Güvenlik açısından, bu tür sorgularda her zaman Laravel'in Query Builder veya Eloquent yöntemlerini kullanarak SQL injection riskini ortadan kaldırmış olursunuz.

Güvenlik Uyarısı: Veritabanı sorgusu içeren doğrulama kurallarında, özellikle çok büyük veri setleriyle çalışıyorsanız performans kaybına dikkat edin. Mümkün olduğunda veritabanı indekslerini kullanın ve gereksiz sorgu tekrarlarından kaçının.

Özelleştirilmiş Kural Yöntemleri Karşılaştırması

Yöntem Avantajı Dezavantajı
Rule Sınıfı Yeniden kullanılabilir, temiz kod. Ek dosya oluşturur.
Closure Hızlı, dosya gerektirmez. Tekrar kullanımı zor.
FormRequest Controller'ı sadeleştirir. Öğrenme eğrisi daha dik.

Sıkça Sorulan Sorular

Özelleştirilmiş kurala nasıl parametre aktarabilirim?

Kural sınıfınızın constructor metoduna parametre ekleyerek, kuralı çağırırken bu değerleri geçebilirsiniz.

Hata mesajını nasıl özelleştirebilirim?

Kural sınıfınızda message() metodunu tanımlayarak veya lang/tr/validation.php dosyasına özel anahtarlar ekleyerek mesajları özelleştirebilirsiniz.

Bir kural birden fazla alana uygulanabilir mi?

Evet, oluşturduğunuz kural sınıfını istediğiniz her doğrulama dizisinde new KuralAdi şeklinde kullanabilirsiniz.

Doğrulama kurallarını test etmek için ne yapmalıyım?

Laravel'in Feature testlerini kullanarak, geçersiz veri gönderdiğinizde uygulamanın doğru hata mesajını döndürdüğünü doğrulayan testler yazmalısınız.

Kural sınıfları üretim ortamında yavaş mı çalışır?

Hayır, Laravel bu sınıfları optimize eder. Ancak veritabanı sorgusu yapan kurallarda veritabanı performansınız doğrudan etkilidir.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Uygulamanızın güvenliği için her zaman kullanıcı girdilerini sanitize edin ve Laravel'in yerleşik güvenlik özelliklerini (CSRF koruması, şifreleme vb.) kullanmayı ihmal etmeyin.

İleri Düzey İpucu: Çok Dilli Hata Mesajları Yönetimi

Özelleştirilmiş doğrulama kurallarınızda hata mesajlarını doğrudan message() metodu içinde sabit bir string olarak döndürmek, uygulamanızın yerelleştirme (localization) yeteneğini kısıtlar. Profesyonel bir Laravel projesinde, hata mesajlarını dil dosyalarınızda yönetmek en iyi uygulamadır.

resources/lang/tr/validation.php dosyanıza kuralınız için bir anahtar ekleyerek işe başlayın:

// resources/lang/tr/validation.php
return [
    'custom_rule' => ':attribute alanı geçersiz bir format içeriyor.',
];

Ardından, kural sınıfınızdaki message() metodunu şu şekilde güncelleyin:

public function message()
{
    return trans('validation.custom_rule');
}

Bu yöntem, uygulamanızın farklı dillerde yayınlanması durumunda doğrulama mesajlarının otomatik olarak çevrilmesini sağlar ve kodunuzu daha temiz tutar.

Doğrulama Süreçlerinde Hata Ayıklama (Debugging)

Karmaşık doğrulama kuralları yazarken, bazen beklediğiniz değerin kurala ulaşmadığını veya veritabanı sorgusunun yanlış sonuç döndürdüğünü fark edebilirsiniz. Laravel'in Validator sınıfı, doğrulama sırasında hata ayıklama yapmanıza olanak tanıyan bir yapıya sahiptir.

Eğer bir kuralın neden başarısız olduğunu anlamakta güçlük çekiyorsanız, kural sınıfınızın passes metoduna dump() veya Log ekleyerek akışı izleyebilirsiniz:

public function passes($attribute, $value)
{
    // Gelen veriyi loglayarak kontrol edin
    \Log::info("Doğrulanan Alan: {$attribute}, Değer: {$value}");

    // Mantıksal kontrol
    return strlen($value) > 5;
}

Ayrıca, Controller katmanında doğrulama hatalarını yakalamak için Validator facade'ini manuel olarak kullanmak, form istekleri (FormRequest) ile uğraşmadan önce hızlı prototipleme yapmanıza yardımcı olur:

$validator = Validator::make($request->all(), [
    'username' => [new MyCustomRule],
]);

if ($validator->fails()) {
    dd($validator->errors()->toArray()); // Hataları anlık ekrana dökün
}

Bu yaklaşım, özellikle dış servislerden (API gibi) gelen verilerin doğrulanması sırasında oluşabilecek beklenmedik veri formatlarını tespit etmenizi kolaylaştırır.

Sonuç

Laravel ile özelleştirilmiş bir veri doğrulama kuralı oluşturmak, uygulamanızın veri kalitesini artırmanın en etkili yollarından biridir. Sınıf tabanlı kurallar ile karmaşık iş mantıklarınızı modüler hale getirebilir, Closure yapısıyla ise hızlı ve pratik çözümler üretebilirsiniz. Bir sonraki adım olarak, Laravel FormRequest sınıflarını inceleyerek doğrulama mantığınızı Controller'larınızdan tamamen ayırmayı deneyebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Deniz Aydın

On yıllık içerik üretimi deneyimiyle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Pratik ev çözümleri ve hayatı kolaylaştıran teknikler konusunda uzmanım.

Yorumlar (0)

Yorum Yaz