TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.8 KiB
69 lines
1.8 KiB
--TEST--
|
|
ThinkPHP Middleware pattern: array_map nested closure and unpacked callable params
|
|
--FILE--
|
|
<?php
|
|
|
|
class ThinkMiddlewareLike
|
|
{
|
|
private array $queue = [];
|
|
|
|
public function add(array|Closure|string $middleware): void
|
|
{
|
|
$this->queue[] = $this->buildMiddleware($middleware);
|
|
}
|
|
|
|
private function buildMiddleware(array|Closure|string $middleware): array
|
|
{
|
|
if (is_array($middleware)) {
|
|
[$middleware, $params] = $middleware;
|
|
}
|
|
|
|
if ($middleware instanceof Closure) {
|
|
return [$middleware, $params ?? []];
|
|
}
|
|
|
|
return [[$middleware, 'handle'], $params ?? []];
|
|
}
|
|
|
|
public function pipeline(): array
|
|
{
|
|
return array_map(function ($middleware) {
|
|
return function ($request, $next) use ($middleware) {
|
|
[$call, $params] = $middleware;
|
|
$response = call_user_func($call, $request, $next, ...$params);
|
|
if (!$response instanceof ThinkResponseLike) {
|
|
throw new LogicException('The middleware must return Response instance');
|
|
}
|
|
return $response;
|
|
};
|
|
}, $this->queue);
|
|
}
|
|
}
|
|
|
|
class ThinkResponseLike
|
|
{
|
|
public function __construct(public string $body)
|
|
{
|
|
}
|
|
}
|
|
|
|
function main(): void
|
|
{
|
|
$middleware = new ThinkMiddlewareLike();
|
|
$middleware->add([
|
|
function ($request, $next, string $prefix, string $suffix): ThinkResponseLike {
|
|
$response = $next($prefix . $request);
|
|
$response->body .= $suffix;
|
|
return $response;
|
|
},
|
|
['[', ']'],
|
|
]);
|
|
|
|
$pipes = $middleware->pipeline();
|
|
$response = $pipes[0]('thinkphp', fn ($request) => new ThinkResponseLike($request . ':next'));
|
|
|
|
var_dump($response->body);
|
|
}
|
|
?>
|
|
--EXPECT--
|
|
string(15) "[thinkphp:next]"
|
|
|