Middleware zinciri
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
-
Pipeline kurucu çağrı
$pipeline = ____($middlewares, $handler);Cevabı göster
$pipeline = buildPipeline($middlewares, $handler); -
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.
-
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