<?php
interface Middleware
{
public static function handle(Closure $next);
}
class VerifyCsrfToken implements Middleware
{
public static function handle(Closure $next)
{
echo "驗證Csrf-Token".'<br>';
$next();
}
}
class ShareErrorsFromSession implements Middleware
{
public static function handle(Closure $next)
{
echo "如果session中有'errors'變量, 則共享它".'<br>';
$next();
}
}
class StartSession implements Middleware
{
public static function handle(Closure $next)
{
echo "開啟session, 獲取數(shù)據(jù)".'<br>';
$next();
echo "保存數(shù)據(jù), 關(guān)閉session".'<br>';
}
}
class AddQueuedCookiesToResponse implements Middleware
{
public static function handle(Closure $next)
{
$next();
echo "添加下一次請求需要的cookie".'<br>';
}
}
class EncryptCookies implements Middleware
{
public static function handle(Closure $next)
{
echo "對輸入請求的cookie進(jìn)行解密".'<br>';
$next();
echo "對輸出響應(yīng)的cookie進(jìn)行加密".'<br>';
}
}
class CheckForMaintenanceMode implements Middleware
{
public static function handle(Closure $next)
{
echo "確定當(dāng)前程序是否處于維護(hù)狀態(tài)".'<br>';
$next();
}
}
// $stack 即 $carry
function getSlice()
{
return function($stack, $pipe)
{
// 輸出 $carry
var_dump($stack());
return function() use ($stack, $pipe)
{
return $pipe::handle($stack);
};
};
}
function then()
{
$pipes = [
"CheckForMaintenanceMode",
"EncryptCookies",
"AddQueuedCookiesToResponse",
"StartSession",
"ShareErrorsFromSession",
"VerifyCsrfToken"];
$firstSlice = function(){
echo "<br>請求向路由器傳遞, 返回響應(yīng) <br><br>";
};
$pipes = array_reverse($pipes);
call_user_func(
array_reduce($pipes, getSlice(), $firstSlice)
);
}
then();
第一次執(zhí)行默認(rèn)值 $firstSlice
carry
攜帶上次迭代里的值存崖; 如果本次迭代是第一次,那么這個值是 initial研侣。
item
攜帶了本次迭代的值洼冻。
initial
如果指定了可選參數(shù) initial闲礼,該參數(shù)將在處理開始前使用贮缅,或者當(dāng)處理結(jié)束,數(shù)組為空時的最后一個結(jié)果璧亚。
請求向路由器傳遞, 返回響應(yīng)
D:\wamp\www\foo.php:61:null
驗證Csrf-Token
請求向路由器傳遞, 返回響應(yīng)
D:\wamp\www\foo.php:61:null
如果session中有'errors'變量, 則共享它
驗證Csrf-Token
請求向路由器傳遞, 返回響應(yīng)
D:\wamp\www\foo.php:61:null
開啟session, 獲取數(shù)據(jù)
如果session中有'errors'變量, 則共享它
驗證Csrf-Token
請求向路由器傳遞, 返回響應(yīng)
保存數(shù)據(jù), 關(guān)閉session
D:\wamp\www\foo.php:61:null
開啟session, 獲取數(shù)據(jù)
如果session中有'errors'變量, 則共享它
驗證Csrf-Token
請求向路由器傳遞, 返回響應(yīng)
保存數(shù)據(jù), 關(guān)閉session
添加下一次請求需要的cookie
D:\wamp\www\foo.php:61:null
對輸入請求的cookie進(jìn)行解密
開啟session, 獲取數(shù)據(jù)
如果session中有'errors'變量, 則共享它
驗證Csrf-Token
請求向路由器傳遞, 返回響應(yīng)
保存數(shù)據(jù), 關(guān)閉session
添加下一次請求需要的cookie
對輸出響應(yīng)的cookie進(jìn)行加密
D:\wamp\www\foo.php:61:null
確定當(dāng)前程序是否處于維護(hù)狀態(tài)
對輸入請求的cookie進(jìn)行解密
開啟session, 獲取數(shù)據(jù)
如果session中有'errors'變量, 則共享它
驗證Csrf-Token
請求向路由器傳遞, 返回響應(yīng)
保存數(shù)據(jù), 關(guān)閉session
添加下一次請求需要的cookie
對輸出響應(yīng)的cookie進(jìn)行加密