From 215d5517c68f541309e71152f88bd451c80786ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=C2=B7x?= Date: Tue, 8 Sep 2020 11:53:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HttpServer/Events/OnRequest.php | 10 ++++++++- HttpServer/Route/Middleware.php | 29 +----------------------- HttpServer/Route/Node.php | 31 ++++++++++++++++++++++++- HttpServer/Route/Reduce.php | 40 +++++++++++++++++++++++++++++++++ HttpServer/Route/Router.php | 2 +- 5 files changed, 81 insertions(+), 31 deletions(-) create mode 100644 HttpServer/Route/Reduce.php diff --git a/HttpServer/Events/OnRequest.php b/HttpServer/Events/OnRequest.php index 8a065857..7c1f578a 100644 --- a/HttpServer/Events/OnRequest.php +++ b/HttpServer/Events/OnRequest.php @@ -9,6 +9,7 @@ use HttpServer\Abstracts\Callback; use HttpServer\Http\Context; use HttpServer\Http\Request as HRequest; use HttpServer\Http\Response as HResponse; +use HttpServer\Route\Node; use HttpServer\Service\Http; use Snowflake\Core\JSON; use Snowflake\Event; @@ -39,7 +40,14 @@ class OnRequest extends Callback if ($sRequest->is('favicon.ico')) { return $sResponse->send($sRequest->isNotFound(), 200); } - $sResponse->send(Snowflake::app()->router->dispatch(), 200); + $node = Snowflake::app()->router->dispatch(); + if (!($node instanceof Node)) { + return $sResponse->send($node, 200); + } + $sResponse->send($content = $node->dispatch(), 200); + if ($node->hasAfter()) { + $node->afterDispatch($content); + } } catch (Error | \Throwable $exception) { $this->sendErrorMessage($sResponse ?? null, $exception, $response); } finally { diff --git a/HttpServer/Route/Middleware.php b/HttpServer/Route/Middleware.php index add1cfd1..6d136e65 100644 --- a/HttpServer/Route/Middleware.php +++ b/HttpServer/Route/Middleware.php @@ -52,22 +52,11 @@ class Middleware $last = function ($passable) use ($node) { return Dispatch::create($node->handler, $passable)->dispatch(); }; - $data = $this->reduce($last, $this->annotation($node)); + $data = Reduce::reduce($last, $this->annotation($node)); return $node->callback = $data; } - /** - * @param $last - * @param $middleWares - * @return mixed|null - */ - private function reduce($last, $middleWares) - { - return array_reduce(array_reverse($middleWares), $this->core(), $last); - } - - /** * @param Node $node * @return array @@ -103,20 +92,4 @@ class Middleware } - /** - * @return Closure - */ - public function core() - { - return function ($stack, $pipe) { - return function ($passable) use ($stack, $pipe) { - if ($pipe instanceof \HttpServer\IInterface\Middleware) { - return $pipe->handler($passable, $stack); - } else { - return $pipe($passable, $stack); - } - }; - }; - } - } diff --git a/HttpServer/Route/Node.php b/HttpServer/Route/Node.php index 3ee51399..740b2fc2 100644 --- a/HttpServer/Route/Node.php +++ b/HttpServer/Route/Node.php @@ -84,6 +84,27 @@ class Node extends Application } + /** + * @return bool + */ + public function hasAfter() + { + return count($this->_after) > 0; + } + + + /** + * @param $response + * @return mixed|null + */ + public function afterDispatch($response) + { + return Reduce::reduce(function () use ($response) { + return $response; + }, $this->_after); + } + + /** * @return array */ @@ -102,7 +123,6 @@ class Node extends Application } - /** * @return array */ @@ -391,6 +411,15 @@ class Node extends Application } + /** + * @return mixed + */ + public function dispatch() + { + return call_user_func($this->callback, \request()); + } + + /** * @param $array * @param $_temp diff --git a/HttpServer/Route/Reduce.php b/HttpServer/Route/Reduce.php new file mode 100644 index 00000000..b79a6b82 --- /dev/null +++ b/HttpServer/Route/Reduce.php @@ -0,0 +1,40 @@ +handler($passable, $stack); + } else { + return $pipe($passable, $stack); + } + }; + }; + } + +} diff --git a/HttpServer/Route/Router.php b/HttpServer/Route/Router.php index 345fec6d..f4f8ba7b 100644 --- a/HttpServer/Route/Router.php +++ b/HttpServer/Route/Router.php @@ -420,7 +420,7 @@ class Router extends Application implements RouterInterface if (empty($node->callback)) { return JSON::to(404, 'Page not found.'); } - return call_user_func($node->callback, $request); + return $node; }