Validation, kod tabanını yavaş yavaş mahvedebilecek “küçük” şeylerden biridir. Başlangıçta, controller’larınızın içinde birkaç request()->validate() çağrısı vardır; ama daha fazla alan ve endpoint ekledikçe, karşınıza tekrarlanan validation dizileri ve koşullar ile dolu controller’lar çıkar.
Laravel Form Requests, validation ve yetkilendirmeyi özel sınıflara taşıyarak bu sorunu çözer.
Başlangıçta birkaç request()->validate() çağrısı vardır. Sonrasında daha fazla alan, daha fazla endpoint, daha fazla kural ekledikçe aniden:
- tekrarlanan validation dizileri,
- koşullerle dolu controller’lar,
- tutarsız hata mesajları,
- ve “bunu yapmaya kim yetkili?” kontrollerinin validation mantığı ile karışması oluşur.
Felsefe: Controller’lar Orkestre Eder, Form Requests Doğrular
Felsefe: Controller’lar Orkestre Eder, Form Requests Doğrular
Bir Form Request, şunları merkezileştirir:
- rules(): Validation mantığınız.
- authorize(): Eylemi gerçekleştirme yetkisi olanlar.
- messages(): Özel hata mesajları.
- prepareForValidation(): Kurallar uygulanmadan önce verileri normalleştirme.
Kısacası:
Controller’lar orkestre eder. Form Requests doğrular (ve yetkilendirebilir).
Neden Form Requests Kullanmalıyız?
Neden Form Requests Kullanmalıyız?
1) Controller’ları Temiz Tutun
1) Controller’ları Temiz Tutun
Controller’lar, ne yapılması gerektiğine odaklanır, nasıl doğrulanacağına değil.
2) Kuralları Güvenli Bir Şekilde Yeniden Kullanın
2) Kuralları Güvenli Bir Şekilde Yeniden Kullanın
Bir StorePostRequest ve UpdatePostRequest, kural paylaşımı ya da genişletmesi yapabilir, kopyala/yapıştır gerektirmeden.
3) Eylemler için Yetkilendirmeyi Merkezileştirin
3) Eylemler için Yetkilendirmeyi Merkezileştirin
authorize(), Politikalarla harika bir şekilde eşleşebilir:
- Politika kaynak izinlerini belirler.
- Form Request eylem izinlerini belirler (örn. “oluşturabilir mi?”)
4) Daha Kolay Test
4) Daha Kolay Test
Form Requests, validation ve uç durumları test etmeyi basit hale getirir.
Bir Form Request Oluşturma
Bir Form Request Oluşturma
php artisan make:request StoreProjectRequest
Bir şey alacaksınız:
// app/Http/Requests/StoreProjectRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreProjectRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [];
}
}
Temel Örnek: Bir Projeyi Kaydet
Temel Örnek: Bir Projeyi Kaydet
Form Request
Form Request
// app/Http/Requests/StoreProjectRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class StoreProjectRequest extends FormRequest
{
public function authorize(): bool
{
// Seçenek A: basit tut
return auth()->check();
// Seçenek B: Bir Politikaya devretmek (birçok uygulamada önerilir)
// return $this->user()->can('create', Project::class);
}
public function rules(): array
{
return [
'name' => ['required', 'string', 'min:3', 'max:120'],
'description' => ['nullable', 'string', 'max:2000'],
'status' => ['required', Rule::in([, ])],
'starts_at' => [, ],
];
}
}
Controller Küçük Kalır
Controller Küçük Kalır
// app/Http/Controllers/ProjectController.php
use App\Http\Requests\StoreProjectRequest;
class ProjectController
{
public function store(StoreProjectRequest $request)
{
$data = $request->validated();
// ... yaratım mantığı (model/hizmet/kullanım durumu)
// Project::create([...$data, 'user_id' => $request->user()->id]);
return redirect()->back()->with(, );
}
}
Burada dikkat çekici olan:
- validation controller içinde değil
$request->validated()sadece geçerli alanların geçmesini garanti eder
Hata Mesajlarını Geliştirme (isteğe bağlı)
Hata Mesajlarını Geliştirme (isteğe bağlı)
public function messages(): array
{
return [
=> ,
=> ,
];
}
public function attributes(): array
{
return [
=> ,
];
}
prepareForValidation() ile Girişi Normalleştirme
prepareForValidation() ile Girişi Normalleştirme
Kurallar uygulanmadan önce verileri temizlemek için çok faydalıdır.
protected function prepareForValidation(): void
{
->merge([
=> (() ->input()),
]);
}
Yaygın kullanım durumları:
- string’leri trimleme,
- “on” değerini boolean’a çevirme,
- eski anahtarları eşleştirme,
- eksik değerleri varsayılan hale getirme.
Gelişmiş Desen: Store/Update için Paylaşılan Kurallar
Gelişmiş Desen: Store/Update için Paylaşılan Kurallar
Güncellemeleriniz genellikle hafifçe farklı kurallara sahiptir (örn. benzersizlik kısıtlamaları).
// app/Http/Requests/UpdateProjectRequest.php
use Illuminate\Validation\Rule;
public function rules(): array
{
= ->route()?->;
return [
=> [
, , ,
Rule::(, )->(),
],
=> [, ::([, , ])],
];
}
Form Requests Politikalar ile Nasıl Uyum Sağlar
Form Requests Politikalar ile Nasıl Uyum Sağlar
Temiz bir yapı:
- Politika → kaynak düzeyinde izinler (“bu projeyi güncelleyebilir mi?”)
- Form Request → veri doğrulaması (+ isteğe bağlı eylem düzeyi kontrolü)
Örnek:
- Controller
$this->authorize('update', $project)çağrısı yapar (Politika) - Form Request alanları doğrular ve girişi şekillendirir
Bu ayrım, yetkilendirme mantığınızı belirgin ve yeniden kullanılabilir hale getirir.
Doğrulamayı Hızla Test Etme
Doğrulamayı Hızla Test Etme
Birkaç test bile regresyonları önleyebilir.
public function test_project_name_is_required(): void
{
= ->(, [
=> ,
=> ,
]);
->([]);
}
Kopyala/Yapıştır Kontrol Listesi
Kopyala/Yapıştır Kontrol Listesi
- [ ] Her eylem için bir Form Request oluşturun (
StoreXRequest,UpdateXRequest) - [ ] Controller’ları ince tutun:
$request->validated() - [ ] Gerekirse
prepareForValidation()ile girişi normalleştirin - [ ] Politikalari kaynak izinleri için kullanın; isteğe bağlı olarak
authorize()içinde çağırın - [ ] Kritik validasyon kuralları için 3-5 test ekleyin
Kapanış
Kapanış
Laravel Form Requests, bir projeyi büyüdükçe temiz tutmamıza yardımcı olan basit bir alışkanlıktır:
- controller’lar okunabilir kalır,
- validation kuralları tutarlı kalır,
- yetkilendirme daha net hale gelebilir,
- ve yeniden düzenlemeler daha güvenli hale gelir.
Kaynak: Orijinal Makale
- Felsefe: Controller’lar Orkestre Eder, Form Requests Doğrular
- Neden Form Requests Kullanmalıyız?
- 1) Controller’ları Temiz Tutun
- 2) Kuralları Güvenli Bir Şekilde Yeniden Kullanın
- 3) Eylemler için Yetkilendirmeyi Merkezileştirin
- 4) Daha Kolay Test
- Bir Form Request Oluşturma
- Temel Örnek: Bir Projeyi Kaydet
- Hata Mesajlarını Geliştirme (isteğe bağlı)
- prepareForValidation() ile Girişi Normalleştirme
- Gelişmiş Desen: Store/Update için Paylaşılan Kurallar
- Form Requests Politikalar ile Nasıl Uyum Sağlar
- Doğrulamayı Hızla Test Etme
- Kopyala/Yapıştır Kontrol Listesi
- Kapanış


