diff --git a/HttpServer/IInterface/After.php b/HttpServer/IInterface/After.php index 808295bd..3a5db710 100644 --- a/HttpServer/IInterface/After.php +++ b/HttpServer/IInterface/After.php @@ -4,9 +4,17 @@ namespace HttpServer\IInterface; +use Closure; + interface After { - public function onHandler($params); + + /** + * @param $params + * @param Closure|null $next + * @return mixed + */ + public function onHandler($params, $next); } diff --git a/HttpServer/Route/Middleware.php b/HttpServer/Route/Middleware.php index af841050..b30e9763 100644 --- a/HttpServer/Route/Middleware.php +++ b/HttpServer/Route/Middleware.php @@ -11,6 +11,7 @@ namespace HttpServer\Route; use Closure; use Exception; use HttpServer\Route\Dispatch\Dispatch; +use Snowflake\Snowflake; use Swoole\Coroutine; /** @@ -53,12 +54,11 @@ class Middleware $last = function ($passable) use ($node) { $responseData = Dispatch::create($node->handler, $passable)->dispatch(); response()->send($responseData, 200); - Coroutine::create(function () use ($responseData, $node) { + if ($node->hasAfter()) { $node->afterDispatch($responseData); - }); + } }; - $data = Reduce::reduce($last, $this->annotation($node)); - return $node->callback = $data; + return $node->callback = Reduce::reduce($last, $this->annotation($node)); } diff --git a/HttpServer/Route/Node.php b/HttpServer/Route/Node.php index c5639111..957b7a10 100644 --- a/HttpServer/Route/Node.php +++ b/HttpServer/Route/Node.php @@ -100,7 +100,8 @@ class Node extends Application */ public function afterDispatch($response) { - return call_user_func($this->_after, $response); + $callback = Reduce::after($this->_after); + return $callback($response); } diff --git a/HttpServer/Route/Reduce.php b/HttpServer/Route/Reduce.php index b79a6b82..544f4532 100644 --- a/HttpServer/Route/Reduce.php +++ b/HttpServer/Route/Reduce.php @@ -5,6 +5,7 @@ namespace HttpServer\Route; use Closure; +use HttpServer\IInterface\After; class Reduce { @@ -21,6 +22,24 @@ class Reduce } + /** + * @param $middleWares + * @return mixed|null + */ + public static function after($middleWares) + { + return array_reduce(array_reverse($middleWares), function ($stack, $pipe) { + return function ($passable) use ($stack, $pipe) { + if ($pipe instanceof After) { + return $pipe->onHandler($passable, $stack); + } else { + return $pipe($passable, $stack); + } + }; + }); + } + + /** * @return Closure */