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
$fillabledizisini 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,
Closurekullanarak 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.


Yorumlar (0)
Yorum Yaz