PHPミドルウェア実現原理
1369 ワード
現在、よく使われているフレームワークには実装ミドルウェアがありますが、ミドルウェアはどのように実装されていますか?
ここで実現する方法は,閉包することにより実現するが,もちろんAST法により実現し,ソースコードをASTツリーに解析し,切り込みが必要な場所にコードを挿入し,コードに復元することも可能であり,この実現方法は複雑すぎて,一般的に複雑な切り込みを実現する必要がある場合にのみ必要である.
上記コードを実行し、次のように印刷します.
ここで実現する方法は,閉包することにより実現するが,もちろん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-"