From 2d53d7a1d92e4e9830304f7acf259c91de36be8e Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Sun, 5 Mar 2023 11:44:36 +0800 Subject: [PATCH] middleware enhancement for passing arguments --- src/Globals/global_class_alias.php | 3 +++ src/ZM/Annotation/AnnotationParser.php | 2 +- src/ZM/Annotation/Middleware/Middleware.php | 4 ++-- src/ZM/Middleware/MiddlewareArgTrait.php | 20 ++++++++++++++++++++ src/ZM/Middleware/MiddlewareHandler.php | 10 +++++++--- src/ZM/Middleware/TimerMiddleware.php | 2 ++ 6 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 src/ZM/Middleware/MiddlewareArgTrait.php diff --git a/src/Globals/global_class_alias.php b/src/Globals/global_class_alias.php index 727eaeb2..00d89c17 100644 --- a/src/Globals/global_class_alias.php +++ b/src/Globals/global_class_alias.php @@ -22,6 +22,9 @@ class_alias(\ZM\Annotation\OneBot\CommandHelp::class, 'CommandHelp'); class_alias(\ZM\Annotation\Closed::class, 'Closed'); +class_alias(\ZM\Middleware\MiddlewareArgTrait::class, 'MiddlewareArgTrait'); +class_alias(\ZM\Middleware\Pipeline::class, 'Pipeline'); + class_alias(\ZM\Plugin\ZMPlugin::class, 'ZMPlugin'); class_alias(\ZM\Context\BotContext::class, 'BotContext'); class_alias(\ZM\Utils\ZMRequest::class, 'ZMRequest'); diff --git a/src/ZM/Annotation/AnnotationParser.php b/src/ZM/Annotation/AnnotationParser.php index 9e7b3c68..641ab148 100644 --- a/src/ZM/Annotation/AnnotationParser.php +++ b/src/ZM/Annotation/AnnotationParser.php @@ -60,7 +60,7 @@ class AnnotationParser // 如果需要,添加内置的注解解析器 if ($with_internal_parsers) { $this->special_parsers = [ - Middleware::class => [function (Middleware $middleware) { \middleware()->bindMiddleware([resolve($middleware->class), $middleware->method], $middleware->name, $middleware->params); }], + Middleware::class => [function (Middleware $middleware) { \middleware()->bindMiddleware([resolve($middleware->class), $middleware->method], $middleware->name, $middleware->args); }], Route::class => [[$this, 'addRouteAnnotation']], Closed::class => [fn () => false], Cron::class => [[resolve(Schedule::class), 'addSchedule']], diff --git a/src/ZM/Annotation/Middleware/Middleware.php b/src/ZM/Annotation/Middleware/Middleware.php index fb4b09e1..3269c62b 100644 --- a/src/ZM/Annotation/Middleware/Middleware.php +++ b/src/ZM/Annotation/Middleware/Middleware.php @@ -21,14 +21,14 @@ use ZM\Annotation\Interfaces\ErgodicAnnotation; class Middleware extends AnnotationBase implements ErgodicAnnotation { /** - * @param string[] $params + * @param string[] $args */ public function __construct( /** * @Required() */ public $name, - public array $params = [] + public array $args = [] ) { } } diff --git a/src/ZM/Middleware/MiddlewareArgTrait.php b/src/ZM/Middleware/MiddlewareArgTrait.php new file mode 100644 index 00000000..18ee2cd0 --- /dev/null +++ b/src/ZM/Middleware/MiddlewareArgTrait.php @@ -0,0 +1,20 @@ +args; + } + + public function setArgs(array $args): void + { + $this->args = $args; + } +} diff --git a/src/ZM/Middleware/MiddlewareHandler.php b/src/ZM/Middleware/MiddlewareHandler.php index 04955927..bddf3c09 100644 --- a/src/ZM/Middleware/MiddlewareHandler.php +++ b/src/ZM/Middleware/MiddlewareHandler.php @@ -60,7 +60,7 @@ class MiddlewareHandler /** * @throws InvalidArgumentException */ - public function bindMiddleware(callable $callback, string $name, array $params = []) + public function bindMiddleware(callable $callback, string $name, array $args = []) { $stack_id = $this->getStackId($callback); // TODO: 对中间件是否存在进行检查 @@ -68,7 +68,7 @@ class MiddlewareHandler $obj = resolve($name); } - $this->reg_map[$stack_id][] = [$name, $params]; + $this->reg_map[$stack_id][] = [$name, $args]; } public function getPipeClosure(callable $callback, $stack_id) @@ -80,7 +80,11 @@ class MiddlewareHandler $this->stack[$stack_id][] = $item; // 如果是 pipeline 形式的中间件,则使用闭包回去 if (class_exists($item[0]) && is_a($item[0], PipelineInterface::class, true)) { - return resolve($item[0])->handle(function (...$args) use ($mid_list, &$pipe_func) { + $resolve = resolve($item[0]); + if (method_exists($resolve, 'setArgs')) { + $resolve->setArgs($item[1]); + } + return $resolve->handle(function (...$args) use ($mid_list, &$pipe_func) { return $pipe_func($mid_list, ...$args); }, ...$args); } elseif (isset($this->middlewares[$item[0]]['before'])) { diff --git a/src/ZM/Middleware/TimerMiddleware.php b/src/ZM/Middleware/TimerMiddleware.php index c8186232..47aa2422 100644 --- a/src/ZM/Middleware/TimerMiddleware.php +++ b/src/ZM/Middleware/TimerMiddleware.php @@ -6,6 +6,8 @@ namespace ZM\Middleware; class TimerMiddleware implements MiddlewareInterface, PipelineInterface { + use MiddlewareArgTrait; + public function handle(callable $callback, ...$params) { $starttime = microtime(true);