CodeBlanks Logo Icon CodeBlanks

Middleware zinciri

PHP kursu · İleri seviye · Ders 69/92

Birden fazla middleware'i dizi ve callable ile zincirlemeyi öğrenirsin.

Middleware zinciri (chain)

Tek bir middleware yerine bir dizi middleware'i arka arkaya çalıştırmak istersin. Her biri $next ile bir sonrakine devreder; en sonda gerçek işleyici (handler) yanıtı üretir.

Bu yapıya pipeline denir. array_reduce ile middleware dizisini tek bir callable'a katlayabilirsin. Her adım, içine aldığı $next'i saran yeni bir closure üretir.

Sıra önemlidir: ilk middleware en dış katman olur, yani before kısmı en önce, after kısmı en sonra çalışır. Bu yüzden array_reverse ile diziyi ters çevirip öyle katlamak gerekir.

array_reduce ile pipeline

buildPipeline şu şekilde çalışır: array_reduce, ters çevrilmiş middleware dizisi üzerinde dolaşır. Başlangıç değeri en içteki işleyicidir. Her adımda, $mw ve $next'i saran yeni bir closure döndürülür.

Sarmalayıcı closure: function ($request) use ($mw, $next) { return $mw($request, $next); }. Böylece dıştan içe doğru her middleware, kendinden sonraki çağrıyı sarmış olur.

Ters çevirme nedeni: array_reduce soldan sağa gider; ilk middleware en dış katman olmalı. Ters çevirmediğinde sıra tersine döner.

Uygulama buildPipeline fonksiyonunu yaz

Bir buildPipeline(array $middlewares, callable $handler): callable fonksiyonu tanımla. array_reduce ile array_reverse($middlewares) üzerinde dolaş; her adımda $mw ve $next'i saran bir closure döndür. $finalHandler ve $middlewares zaten tanımlı. Pipeline'ı kur, "istek" ile çağır ve sonucu yazdır.

Örnek çözümü göster
callable { return array_reduce(array_reverse($middlewares), function ($next, $mw) { return function ($request) use ($mw, $next) { return $mw($request, $next); }; }, $handler); } yaz. Sonra $pipeline = buildPipeline($middlewares, $finalHandler); echo $pipeline("istek") . "\n"; çağır.
Örnek çözüm:
<?php
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);
}
$finalHandler = function ($request) {
    return "TAMAM";
};
$middlewares = [
    function ($request, $next) {
        echo "A-before\n";
        $r = $next($request);
        echo "A-after\n";
        return $r;
    },
    function ($request, $next) {
        echo "B-before\n";
        $r = $next($request);
        echo "B-after\n";
        return $r;
    },
];
$pipeline = buildPipeline($middlewares, $finalHandler);
echo $pipeline("istek") . "\n";

Kendini test et

  1. Pipeline kurucu çağrı

    $pipeline = ____($middlewares, $handler);
    Cevabı göster
    $pipeline = buildPipeline($middlewares, $handler);
  2. array_reduce ile pipeline kurarken dizi neden ters çevrilir?

    • Diziyi alfabetik sıralamak için
    • Daha hızlı çalışması için
    • İlk middleware en dış katman olsun diye
    • Hafıza tasarrufu sağlamak için
    Cevabı göster

    İlk middleware en dış katman olsun diye — Doğru. array_reduce soldan sağa gider; ters çevirmek ilk middleware'i en dışa koyar.

  3. Pipeline araçlarını eşleştir

    array_reduce
    Diziyi tek değere indirir
    array_reverse
    Dizi sırasını ters çevirir
    callable
    Çağrılabilir işlev
    Closure
    Adsız işlev

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