本文主要和大家分享PHP中介軟體解析,中介軟體是一個閉包,而且返回一個閉包。中介軟體為過濾進入應用的HTTP請求提供了一套便利的機制,可以分為前置中介軟體和後置中介軟體。常用於驗證使用者是否經
過認證,添加回應標頭(跨域),記錄請求日誌等。
例子
<?php// 架構核心應用程式層$application = function($name) { echo "this is a {$name} application\n";};// 前置校正中介軟體$auth = function($handler) { return function($name) use ($handler) { echo "{$name} need a auth middleware\n"; return $handler($name); };};// 前置過濾中介軟體$filter = function($handler) { return function($name) use ($handler) { echo "{$name} need a filter middleware\n"; return $handler($name); };};// 後置日誌中介軟體$log = function($handler) { return function($name) use ($handler) { $return = $handler($name); echo "{$name} need a log middleware\n"; return $return; };};// 中介軟體棧$stack = [];// 打包function pack_middleware($handler, $stack){ foreach (array_reverse($stack) as $key => $middleware) { $handler = $middleware($handler); } return $handler;}// 註冊中介軟體// 這裡用的都是全域中介軟體,實際應用時還可以為指定路由註冊局部中介軟體$stack['log'] = $log;$stack['filter'] = $filter;$stack['auth'] = $auth;$run = pack_middleware($application, $stack);$run('Laravle');
輸出:
Laravle need a filter middleware
Laravle need a auth middleware
this is a Laravle application
Laravle need a log middleware
打包程式
中介軟體的執行順序是由打包函數(pack_middleware)決定,這裡返回的閉包實際上相當於:
$run = $log($filter($auth($application)));$run('Laravle');
編寫規範
中介軟體要要滿足一定的規範:總是返回一個閉包,閉包中總是傳入相同的參數(由主要邏輯決定), 閉包總是返回控制代碼(handler)的執行結果;
如果中介軟體的邏輯在返回控制代碼return $handler($name)前完成,就是前置中介軟體,否則為後置中介軟體。