This commit is contained in:
2020-09-09 10:42:16 +08:00
parent 286ee22d18
commit 8ae7ca9a18
4 changed files with 34 additions and 6 deletions
+9 -1
View File
@@ -4,9 +4,17 @@
namespace HttpServer\IInterface; namespace HttpServer\IInterface;
use Closure;
interface After interface After
{ {
public function onHandler($params);
/**
* @param $params
* @param Closure|null $next
* @return mixed
*/
public function onHandler($params, $next);
} }
+4 -4
View File
@@ -11,6 +11,7 @@ namespace HttpServer\Route;
use Closure; use Closure;
use Exception; use Exception;
use HttpServer\Route\Dispatch\Dispatch; use HttpServer\Route\Dispatch\Dispatch;
use Snowflake\Snowflake;
use Swoole\Coroutine; use Swoole\Coroutine;
/** /**
@@ -53,12 +54,11 @@ class Middleware
$last = function ($passable) use ($node) { $last = function ($passable) use ($node) {
$responseData = Dispatch::create($node->handler, $passable)->dispatch(); $responseData = Dispatch::create($node->handler, $passable)->dispatch();
response()->send($responseData, 200); response()->send($responseData, 200);
Coroutine::create(function () use ($responseData, $node) { if ($node->hasAfter()) {
$node->afterDispatch($responseData); $node->afterDispatch($responseData);
}); }
}; };
$data = Reduce::reduce($last, $this->annotation($node)); return $node->callback = Reduce::reduce($last, $this->annotation($node));
return $node->callback = $data;
} }
+2 -1
View File
@@ -100,7 +100,8 @@ class Node extends Application
*/ */
public function afterDispatch($response) public function afterDispatch($response)
{ {
return call_user_func($this->_after, $response); $callback = Reduce::after($this->_after);
return $callback($response);
} }
+19
View File
@@ -5,6 +5,7 @@ namespace HttpServer\Route;
use Closure; use Closure;
use HttpServer\IInterface\After;
class Reduce 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 * @return Closure
*/ */