This commit is contained in:
2026-06-12 23:57:20 +08:00
parent 4cfd04c988
commit 28973df8b6
4 changed files with 101 additions and 4 deletions
+52
View File
@@ -5,6 +5,7 @@ namespace Kiri\Router;
use Closure;
use Kiri;
use Kiri\Router\Annotate\Defer;
use Kiri\Router\Format\IFormat;
use Kiri\Router\Format\MixedFormat;
use Kiri\Router\Format\NoBody;
@@ -32,6 +33,11 @@ class Handler implements RequestHandlerInterface
*/
protected array $middlewares = [];
/**
* @var Defer[]
*/
protected array $deferred = [];
protected ?string $sourceFile = null;
protected string $sourceKind = 'attribute';
@@ -152,6 +158,25 @@ class Handler implements RequestHandlerInterface
}
/**
* @param Defer[] $deferred
* @return void
*/
public function setDeferred(array $deferred): void
{
$this->deferred = $deferred;
}
/**
* @return Defer[]
*/
public function getDeferred(): array
{
return $this->deferred;
}
/**
* @param ServerRequestInterface $request
* @return ResponseInterface
@@ -163,8 +188,35 @@ class Handler implements RequestHandlerInterface
$data = call_user_func([$controller, $this->handler[1]], ...$this->parameters);
$this->executeDeferred();
/** 根据返回类型 */
return $this->format->call($data);
}
/**
* @return void
*/
private function executeDeferred(): void
{
foreach ($this->deferred as $defer) {
try {
$callback = $defer->callback;
$params = $defer->params;
if (is_array($callback)) {
[$class, $method] = $callback;
$instance = Kiri::getDi()->get($class);
call_user_func([$instance, $method], ...$params);
} else {
$instance = Kiri::getDi()->get($callback);
call_user_func([$instance, '__invoke'], ...$params);
}
} catch (\Throwable $throwable) {
\Kiri::getLogger()->error('Defer callback failed: ' . $throwable->getMessage());
}
}
}
}