现在常用框架都有实现中间件,那么中间件是如何实现的呢?
这里实现的方法是通过闭包,当然也可以通过AST方法实现,将源码解析为AST树,在需要切入的地方插入代码,然后还原为代码,这种实现方法过于复杂,一般只有需要实现复杂的切入时才需要。
class A{
public function run($a){
echo "A:".$a;
}
}
class B{
public function run($name,$handler){
var_dump('B');
$log= $handler($name);
var_dump('B-');
return $log;
}
}
class C{
public function run($name,$handler){
var_dump('C');
$log= $handler($name);
var_dump('C-');
return $log;
}
}
$aa = function($a){
return (new A)->run($a);
};
$stack[]=B::class;
$stack[]=C::class;
function middleware($handler, $stack)
{
foreach (array_reverse($stack) as $key => $middleware)
{
$log = function($handler) use($middleware){
return function($name) use ($handler,$middleware) {
$class = new $middleware();
return $class->run($name,$handler);
};
};
$handler=$log($handler);
}
return $handler;
}
$run = middleware($aa,$stack);
$run('asd');
执行上述代码,打印如下内容
string(1) "B"
string(1) "C"
A:asdstring(2) "C-"
string(2) "B-"
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。