diff --git a/src/MiddlewareProxyGenerator.php b/src/MiddlewareProxyGenerator.php new file mode 100644 index 0000000..d6bfb53 --- /dev/null +++ b/src/MiddlewareProxyGenerator.php @@ -0,0 +1,102 @@ + [new Node\Name\FullyQualified(\Psr\Http\Server\MiddlewareInterface::class)], + 'stmts' => [] + ] + ); + + // 生成中间件调用链 + $method = self::createMethodNode($middlewares); + $class->stmts[] = $method; + + // 生成代码 + $printer = new Standard(); + return $printer->prettyPrintFile([$class]); + } + + private static function createMethodNode(array $middlewares): Node\Stmt\Function_ { + $method = new Node\Stmt\Function_( + 'process', + [ + 'params' => [ + new Node\Param( + new Node\Expr\Variable('request'), + null, + new Node\UnionType([new Node\Expr\Variable(\Psr\Http\Message\ServerRequestInterface::class)]) + ), + new Node\Param( + new Node\Expr\Variable('handler'), + null, + new Node\UnionType([new Node\Expr\Variable(\Psr\Http\Server\RequestHandlerInterface::class)]) + ) + ], + 'returnType' => new Node\Name(ResponseInterface::class), + 'stmts' => [] + ] + ); + + // 生成中间件调用链(v5.5.0闭包写法) + $chain = []; + $count = count($middlewares); + for ($i = 0; $i < $count; $i++) { + $className = $middlewares[$i]::class; + $chain[] = self::createMiddlewareCall($i, $className, $count); + } + + $method->stmts = array_reverse($chain); + return $method; + } + + private static function createMiddlewareCall(int $index, string $className, int $count): Node { + $mwVar = new Node\Expr\Variable("mw{$index}"); + $nextHandler = new Node\Expr\Variable("next"); + + // 创建中间件实例(v5.5.0兼容) + $instanciate = new Node\Expr\New_($className); + + // 创建闭包表达式(v5.5.0语法) + $closure = new Node\Expr\Closure([ + 'static' => true, + 'params' => [new Node\Param($nextHandler)], + 'stmts' => [ + new Node\Stmt\Expression( + new Node\Expr\MethodCall( + $instanciate, + 'process', + [new Node\Arg($nextHandler), new Node\Arg($mwVar)] + ) + ) + ] + ]); + + return new Node\Stmt\Expression($closure); + } +} + +// 生成代理类代码 +$middlewares = [AuthMiddleware::class, LogMiddleware::class]; +$proxyCode = MiddlewareProxyGenerator::generateProxy($middlewares); + +// 写入代理类文件 +file_put_contents(MiddlewareProxyGenerator::$cacheFile, $proxyCode); diff --git a/src/Validator/ValidatorMiddleware.php b/src/Validator/ValidatorMiddleware.php index 848ef44..79df15b 100644 --- a/src/Validator/ValidatorMiddleware.php +++ b/src/Validator/ValidatorMiddleware.php @@ -39,7 +39,7 @@ class ValidatorMiddleware implements MiddlewareInterface if (!$validator->run($request)) { Kiri::getLogger()->println($request->getUri()->getPath() . ' `' . $validator->error() . '`'); - return $this->response->html($validator->error(), 415); + return $this->response->html($validator->error(), 400); } else { return $handler->handle($request); }