Laravel middleware, doğru yazılsa bile, beklenmedik şekilde davranabilir.
Kimlik doğrulamanın çok geç çalıştığını, izin kontrollerinin başarısız olduğunu veya özel middleware’in beklenmedik bir sırayla yürütüldüğünü fark edebilirsiniz. Çoğu durumda, middleware kodunun kendisi sorun değildir.
Gerçek sorun, middleware yürütme sırasıdır.
Laravel’in middleware’i nasıl işlediğini anlamak, güvenli ve ölçeklenebilir uygulamalar geliştirirken kritik öneme sahiptir çünkü her istek, uygulama mantığınıza ulaşmadan önce birden fazla katmandan geçer.
Yaygın Belirtiler
Aşağıdaki gibi sorunlarla karşılaşabilirsiniz:
- Kimlik doğrulanmış kullanıcıların misafir olarak kabul edilmesi
- Izin middleware’in beklenmedik bir şekilde başarısız olması
- Kiralık bilgiye erişim olmaması
- İstek kaydının kullanıcı bilgilerini atlaması
- Referans kısıtlamasının kimlik doğrulama öncesinde tetiklenmesi
- Giriş sonrası yönlendirme döngüleri
- Middleware’in tamamen yok sayıldığı izlenimi
Bu sorunlar genellikle middleware’in yanlış sırada çalışmasından kaynaklanmaktadır.
Laravel Bir İsteği Nasıl İşler
Tipik bir Laravel isteği aşağıdaki akışı takip eder:
Browser
↓
Global Middleware
↓
Middleware Group (Web/API)
↓
Route Middleware
↓
Controller
↓
Response
↓
Browser
Her middleware katmanı, isteği uygulama mantığınıza ulaşmadan önce inceleyebilir, değiştirebilir, izin verebilir veya engelleyebilir.
Bu nedenle, yürütme sırası önemlidir.
Örnek Sorun #1
Diyelim ki iki middleware’iniz var:
Authenticate User
Log User Activity
Logging middleware’iniz bir doğrulanmış kullanıcı beklentisi içermektedir.
$user = auth()->user();
Ancak, log her zaman null gösteriyor.
Neden?
Çünkü logging middleware’i, kimlik doğrulama öncesinde çalışıyor.
Çözüm, kimlik doğrulama middleware’inin ilk sırada çalıştığını garanti etmektir böylece kullanıcı bilgileri, loglama esnasında mevcut olur.
Örnek Sorun #2
Multi-tenant uygulamalar genellikle kiracı bilgilerini middleware aracılığıyla başlatır.
TenantMiddleware
Eğer başka bir middleware, kiracı başlatılmadan önce veritabanına erişirse, sorgular yanlış veritabanı bağlantısını kullanabilir.
Bu durum, aşağıdaki sorunlara yol açabilir:
Yanlış veri
Eksik kayıtlar
Güvenlik sorunları
Cross-tenant veri ifşası
Kiralık başlatmanın, kiracı bağlamına bağlı middleware’lerden önce yürütülmesi gerekmektedir.
Global Middleware
Global middleware her istekte çalışır.
Örnekler:
Bakım modu
İstek düzenleme
CORS işleme
Proxy işleme
Çünkü bunlar ilk sırada çalışır, tüm uygulama için gerekli olan işlevselliği içermelidir.
Kimlik doğrulama veya iş spesifik mantık global middleware’de yer almamalıdır.
Middleware Grupları
Laravel, şu gibi middleware grupları sunmaktadır:
Web Group
Genellikle içerir:
Oturum yönetimi
CSRF koruma
Çerez şifreleme
Hata paylaşımı
API Group
Genellikle içerir:
API’ye özel middleware
Hız sınırlaması
İstek bağlama
Yanlış grup seçimi, beklenmedik davranışlar oluşturabilir.
Örneğin, oturum bağımlı middleware’in API yollarında kullanılması, kimlik doğrulama sorunlarına yol açabilir.
Route Middleware
Route middleware yalnızca bağlandığı yollar üzerinde çalışır.
Örnek:
Route::middleware([
'auth',
'verified',
'permission'
])->group(function () {
});
Laravel, middleware’i tanımlanan sırayla yürütmektedir.
Sıralamanın değiştirilmesi, uygulamanızın davranışını tamamen değiştirebilir.
Yaygın Hata #1
İzin middleware’inin kimlik doğrulama öncesinde yürütülmesi:
Route::middleware([
'permission',
'auth'
]);
İzin middleware’i, kullanıcı kimliği doğrulanmadan önce izin kontrolü yapmaya çalışır.
Sonuç:
Yetkisiz hatalar
Null kullanıcı istisnaları
Yanlış yönlendirmeler
Doğru sıra:
Route::middleware([
'auth',
'permission'
]);
Yaygın Hata #2
Kimlik Doğrulamadan Önce Loglama:
Route::middleware([
'log',
'auth'
]);
Loglama middleware’i, kimlik doğrulama gerçekleşmediği için kullanıcıyı tanımlayamaz.
Doğru sıra:
Route::middleware([
'auth',
'log'
]);
Middleware Yürütme Hatasını Ayıklama
Yürütme sırası sorunlarını tanımlamanın en kolay yollarından biri log tutmaktır.
Örnek:
public function handle($request, Closure $next)
{
logger('Auth Middleware');
return $next($request);
}
Benzer logları tüm middleware’lere ekleyin.
Log çıktısı, yürütme sırasını hemen gösterir.
Örnek çıktı:
Tenant Middleware
Auth Middleware
Permission Middleware
Logging Middleware
Bu, sorun gidermeyi önemli ölçüde kolaylaştırır.
Laravel 11 Middleware Kaydı
Laravel 11, daha temiz bir middleware yapılandırma yöntemi tanıttı.
Middleware genellikle şurada kaydedilir:
bootstrap/app.php
Yanlış kayıt, aşağıdaki sorunlara yol açabilir:
Middleware’in çalışmaması
Alias bulunamadı hataları
Rotaların koruma atlaması
Yeni middleware oluşturduktan sonra her zaman middleware aliaslarını ve yapılandırmasını doğrulayın.
Route Cache Sorunları
Middleware sorunlarının bir diğer yaygın nedeni, rota önbelleğe almadır.
Middleware yapılandırmasını güncellemiş olabilirsiniz ancak eski davranışları görmeye devam ediyorsanız, önbellekleri temizlemeniz gerekebilir:
php artisan route:clear
php artisan config:clear
php artisan cache:clear
Birçok “middleware çalışmıyor” bildirimi aslında önbellekle ilgili sorunlardır.
En İyi Uygulamalar
✔ Middleware’i tek bir sorumluluk üzerine odaklayın
✔ Yetkilendirme kontrollerinden önce kullanıcıları kimlik doğrulayın
✔ Veritabanı erişiminden önce kiracı bağlamını başlatın
✔ Yürütme sırasını ayıklarken log kullanın
✔ Middleware değişikliklerinden sonra önbellekleri temizleyin
✔ İş mantığını middleware içerisinde tutmaktan kaçının
✔ Middleware’i bağımsız olarak test edin
✔ Rota gruplarını dikkatle gözden geçirin
Son Düşünceler
Middleware yürütme sırası, Laravel geliştirmede sıklıkla göz ardı edilen parçalardan biridir.
Bir middleware mükemmel bir şekilde yazılabilir, doğru kaydedilebilir ve yine de başka bir middleware onun önünde veya arkasında çalıştığı için başarısız olabilir.
Middleware beklenmedik bir şekilde davrandığında, sadece kodu incelemekle yetinmeyin.
Yürütme sırasını da gözden geçirin.
Birçok durumda, düzeltme, middleware’i yeniden yazmak değil, istekteki yaşam döngüsünde doğru konuma yerleştirmektir.
Kaynak: Orijinal Makale


