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;
|
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
|
|
|
{
|
|
|
|
|
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) {
|
2021-03-30 11:56:29 +08:00
|
|
|
logger()->addError($throwable, 'throwable');
|
2021-02-14 22:00:05 +08:00
|
|
|
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
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|