CodeBlanks Logo Icon CodeBlanks

Özet - Middleware

PHP kursu · İleri seviye · Ders 73/92

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

  1. 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
  2. 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.

İleri seviye bölümündeki tüm dersler