PHP 中间件实现原理

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

这里实现的方法是经过闭包,固然也能够经过AST方法实现,将源码解析为AST树,在须要切入的地方插入代码,而后还原为代码,这种实现方法过于复杂,通常只有须要实现复杂的切入时才须要。shell

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-"
相关文章
相关标签/搜索