mirror of
https://github.com/zhamao-robot/zhamao-framework.git
synced 2026-03-18 05:04:51 +08:00
middleware enhancement for passing arguments
This commit is contained in:
parent
5d63859a17
commit
2d53d7a1d9
@ -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');
|
||||
|
||||
@ -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']],
|
||||
|
||||
@ -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 = []
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
*/
|
||||
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'])) {
|
||||
|
||||
@ -6,6 +6,8 @@ namespace ZM\Middleware;
|
||||
|
||||
class TimerMiddleware implements MiddlewareInterface, PipelineInterface
|
||||
{
|
||||
use MiddlewareArgTrait;
|
||||
|
||||
public function handle(callable $callback, ...$params)
|
||||
{
|
||||
$starttime = microtime(true);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user