1

现在常用框架都有实现中间件,那么中间件是如何实现的呢?

这里实现的方法是通过闭包,当然也可以通过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-"

aa杨
1.7k 声望44 粉丝