eee
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user