PHP
Özet - Middleware
Auth, logging ve PSR-15'le korumalı bir API route yapısı kurarsın.
Özet - Middleware
Bu grupta middleware desenini, before/after mantığını, array_reduce ile pipeline kurmayı, auth ve logging katmanlarını ve PSR-15 arayüzünü öğrendin.
Şimdi hepsini birleştir: buildPipeline ile auth ve logging middleware'lerini iç içe zincirle; misafir ve üye istekleri için farklı çıktılar al. Sonra PSR-15 tarzı bir ErrorHandler sınıfı yaz ve istisnaları yakalayıp düzenli yanıt dön.
Bu iki görev, hem callable hem de sınıf tabanlı middleware dünyasını bir arada kullanma pratiği kazandırır.
Uygulama Auth + logging pipeline
Üç fonksiyon tanımla: authMiddleware, loggingMiddleware ve buildPipeline. authMiddleware, $_SESSION['user_id'] yoksa "yetkisiz" döndürsün (early return); yoksa $next($request) sonucunu döndürsün. loggingMiddleware, "[LOG] {$request}" yazdırıp $next($request) sonucunu döndürsün. buildPipeline, array_reduce ve array_reverse ile sarmalayan callable döndürsün. Pipeline'ı kur, önce misafir sonra üye olarak iki kez çağır ve sonuçları yazdır.
Örnek çözümü göster
function authMiddleware($request, $next) { if (!isset($_SESSION['user_id'])) { return "yetkisiz"; } return $next($request); } ve function loggingMiddleware($request, $next) { echo "[LOG] {$request}\n"; return $next($request); } yaz. buildPipeline'i önceki dersten al. Sonra $pipeline = buildPipeline(['loggingMiddleware', 'authMiddleware'], $finalHandler); unset($_SESSION['user_id']); echo $pipeline("panel") . "\n"; $_SESSION['user_id'] = 42; echo $pipeline("panel") . "\n"; çağır.
Örnek çözüm:
<?php
function authMiddleware($request, $next) {
if (!isset($_SESSION['user_id'])) {
return "yetkisiz";
}
return $next($request);
}
function loggingMiddleware($request, $next) {
echo "[LOG] {$request}\n";
return $next($request);
}
function buildPipeline(array $middlewares, callable $handler): callable {
return array_reduce(array_reverse($middlewares), function ($next, $mw) {
return function ($request) use ($mw, $next) {
return $mw($request, $next);
};
}, $handler);
}
session_start();
$finalHandler = function ($request) {
return "TAMAM";
};
$pipeline = buildPipeline(['loggingMiddleware', 'authMiddleware'], $finalHandler);
unset($_SESSION['user_id']);
echo $pipeline("panel") . "\n";
$_SESSION['user_id'] = 42;
echo $pipeline("panel") . "\n";
Uygulama PSR-15 tarzı ErrorHandler
PSR-15 yapısını taklit eden bir ErrorHandler sınıfı tanımla. public function process($request, $handler) metodu olsun. İçinde try { return $handler->handle($request); } çağrısını catch (\Exception $e) ile sarmala; hata olursa "HATA: " . $e->getMessage() döndür. FinalHandler ve CrashHandler zaten tanımlı. ErrorHandler örneğini oluştur, iki handler ile process'i çağır ve sonuçları yazdır.
Örnek çözümü göster
" . $e->getMessage(); } } } yaz. Sonra $eh = new ErrorHandler(); echo $eh->process("istek", new FinalHandler()) . "\n"; echo $eh->process("istek", new CrashHandler()) . "\n"; çağır.
Örnek çözüm:
<?php
class ErrorHandler {
public function process($request, $handler) {
try {
return $handler->handle($request);
} catch (\Exception $e) {
return "HATA: " . $e->getMessage();
}
}
}
class FinalHandler {
public function handle($request) {
return "İŞLENDİ";
}
}
class CrashHandler {
public function handle($request) {
throw new \Exception("sunucu hatası");
}
}
$eh = new ErrorHandler();
echo $eh->process("istek", new FinalHandler()) . "\n";
echo $eh->process("istek", new CrashHandler()) . "\n";
Kendini test et
-
Tüm middleware kavramlarını eşleştir
- $next
- Sonraki adıma geçer
- array_reduce
- Pipeline kurar
- Auth
- Oturum doğrular
- PSR-15
- Standart arayüz
-
Bir pipeline'da ilk middleware ne zaman çalışır?
- Hiçbir zaman
- En son, yanıt dönerken
- En dış katman olarak önce
- Yalnızca hata durumunda
Cevabı göster
En dış katman olarak önce — Doğru. İlk middleware en dış katmandır; before kısmı en önce çalışır.
Sıradaki ders: PHPUnit nedir?