mirror of
https://github.com/zhamao-robot/zhamao-framework.git
synced 2026-07-23 00:25:35 +08:00
middleware enhancement for passing arguments
This commit is contained in:
@@ -22,6 +22,9 @@ class_alias(\ZM\Annotation\OneBot\CommandHelp::class, 'CommandHelp');
|
|||||||
|
|
||||||
class_alias(\ZM\Annotation\Closed::class, 'Closed');
|
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\Plugin\ZMPlugin::class, 'ZMPlugin');
|
||||||
class_alias(\ZM\Context\BotContext::class, 'BotContext');
|
class_alias(\ZM\Context\BotContext::class, 'BotContext');
|
||||||
class_alias(\ZM\Utils\ZMRequest::class, 'ZMRequest');
|
class_alias(\ZM\Utils\ZMRequest::class, 'ZMRequest');
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ class AnnotationParser
|
|||||||
// 如果需要,添加内置的注解解析器
|
// 如果需要,添加内置的注解解析器
|
||||||
if ($with_internal_parsers) {
|
if ($with_internal_parsers) {
|
||||||
$this->special_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']],
|
Route::class => [[$this, 'addRouteAnnotation']],
|
||||||
Closed::class => [fn () => false],
|
Closed::class => [fn () => false],
|
||||||
Cron::class => [[resolve(Schedule::class), 'addSchedule']],
|
Cron::class => [[resolve(Schedule::class), 'addSchedule']],
|
||||||
|
|||||||
@@ -21,14 +21,14 @@ use ZM\Annotation\Interfaces\ErgodicAnnotation;
|
|||||||
class Middleware extends AnnotationBase implements ErgodicAnnotation
|
class Middleware extends AnnotationBase implements ErgodicAnnotation
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param string[] $params
|
* @param string[] $args
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
/**
|
/**
|
||||||
* @Required()
|
* @Required()
|
||||||
*/
|
*/
|
||||||
public $name,
|
public $name,
|
||||||
public array $params = []
|
public array $args = []
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
20
src/ZM/Middleware/MiddlewareArgTrait.php
Normal file
20
src/ZM/Middleware/MiddlewareArgTrait.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -60,7 +60,7 @@ class MiddlewareHandler
|
|||||||
/**
|
/**
|
||||||
* @throws InvalidArgumentException
|
* @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);
|
$stack_id = $this->getStackId($callback);
|
||||||
// TODO: 对中间件是否存在进行检查
|
// TODO: 对中间件是否存在进行检查
|
||||||
@@ -68,7 +68,7 @@ class MiddlewareHandler
|
|||||||
$obj = resolve($name);
|
$obj = resolve($name);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->reg_map[$stack_id][] = [$name, $params];
|
$this->reg_map[$stack_id][] = [$name, $args];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPipeClosure(callable $callback, $stack_id)
|
public function getPipeClosure(callable $callback, $stack_id)
|
||||||
@@ -80,7 +80,11 @@ class MiddlewareHandler
|
|||||||
$this->stack[$stack_id][] = $item;
|
$this->stack[$stack_id][] = $item;
|
||||||
// 如果是 pipeline 形式的中间件,则使用闭包回去
|
// 如果是 pipeline 形式的中间件,则使用闭包回去
|
||||||
if (class_exists($item[0]) && is_a($item[0], PipelineInterface::class, true)) {
|
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);
|
return $pipe_func($mid_list, ...$args);
|
||||||
}, ...$args);
|
}, ...$args);
|
||||||
} elseif (isset($this->middlewares[$item[0]]['before'])) {
|
} elseif (isset($this->middlewares[$item[0]]['before'])) {
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ namespace ZM\Middleware;
|
|||||||
|
|
||||||
class TimerMiddleware implements MiddlewareInterface, PipelineInterface
|
class TimerMiddleware implements MiddlewareInterface, PipelineInterface
|
||||||
{
|
{
|
||||||
|
use MiddlewareArgTrait;
|
||||||
|
|
||||||
public function handle(callable $callback, ...$params)
|
public function handle(callable $callback, ...$params)
|
||||||
{
|
{
|
||||||
$starttime = microtime(true);
|
$starttime = microtime(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user