middleware enhancement for passing arguments

This commit is contained in:
crazywhalecc 2023-03-05 11:44:36 +08:00 committed by Jerry
parent 5d63859a17
commit 2d53d7a1d9
6 changed files with 35 additions and 6 deletions

View File

@ -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');

View File

@ -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']],

View File

@ -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 = []
) {
}
}

View File

@ -0,0 +1,20 @@
<?php
declare(strict_types=1);
namespace ZM\Middleware;
trait MiddlewareArgTrait
{
protected array $args = [];
public function getArgs(): array
{
return $this->args;
}
public function setArgs(array $args): void
{
$this->args = $args;
}
}

View File

@ -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'])) {

View File

@ -6,6 +6,8 @@ namespace ZM\Middleware;
class TimerMiddleware implements MiddlewareInterface, PipelineInterface
{
use MiddlewareArgTrait;
public function handle(callable $callback, ...$params)
{
$starttime = microtime(true);