Files
kiri-core/HttpServer/Route/Reduce.php
T

67 lines
1.3 KiB
PHP
Raw Normal View History

2020-09-08 11:53:09 +08:00
<?php
2020-10-29 18:17:25 +08:00
declare(strict_types=1);
2020-09-08 11:53:09 +08:00
namespace HttpServer\Route;
use Closure;
2020-09-09 10:42:16 +08:00
use HttpServer\IInterface\After;
2020-12-14 18:01:01 +08:00
use HttpServer\IInterface\Middleware;
2021-02-14 22:00:05 +08:00
use Snowflake\Core\Json;
use Snowflake\Event;
2020-09-08 11:53:09 +08:00
class Reduce
{
/**
* @param $last
* @param $middleWares
2020-12-14 17:44:56 +08:00
* @return mixed
2020-09-08 11:53:09 +08:00
*/
2020-12-14 17:44:56 +08:00
public static function reduce($last, $middleWares): mixed
2020-09-08 11:53:09 +08:00
{
2021-03-04 00:33:34 +08:00
var_export($middleWares);
2020-09-08 11:53:09 +08:00
return array_reduce(array_reverse($middleWares), static::core(), $last);
}
2020-09-09 10:42:16 +08:00
/**
* @param $middleWares
2020-12-14 17:44:56 +08:00
* @return mixed
2020-09-09 10:42:16 +08:00
*/
2020-12-14 17:44:56 +08:00
public static function after($middleWares): mixed
2020-09-09 10:42:16 +08:00
{
return array_reduce(array_reverse($middleWares), function ($stack, $pipe) {
2020-09-09 10:44:48 +08:00
return function ($request, $passable) use ($stack, $pipe) {
2021-02-14 22:00:05 +08:00
try {
if (!($pipe instanceof After)) {
return call_user_func($pipe, $request, $passable, $stack);
}
2020-10-29 18:17:25 +08:00
return $pipe->onHandler($request, $passable);
2021-02-14 22:00:05 +08:00
} catch (\Throwable $throwable) {
return Json::to(0, $throwable);
2020-09-09 10:42:16 +08:00
}
};
});
}
2020-09-08 11:53:09 +08:00
/**
* @return Closure
*/
2020-12-14 17:44:56 +08:00
private static function core(): Closure
2020-09-08 11:53:09 +08:00
{
return function ($stack, $pipe) {
return function ($passable) use ($stack, $pipe) {
2020-12-14 18:01:01 +08:00
if ($pipe instanceof Middleware) {
2020-12-14 17:48:29 +08:00
return $pipe->onHandler($passable, $stack);
2020-09-08 11:53:09 +08:00
} else {
2020-12-15 18:47:26 +08:00
return call_user_func($pipe, $passable, $stack);
2020-09-08 11:53:09 +08:00
}
};
};
}
}