Middleware.php 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. namespace think\swoole;
  3. use Closure;
  4. use InvalidArgumentException;
  5. use think\App;
  6. use think\Pipeline;
  7. class Middleware
  8. {
  9. /**
  10. * 中间件执行队列
  11. * @var array
  12. */
  13. protected $queue = [];
  14. /**
  15. * @var App
  16. */
  17. protected $app;
  18. public function __construct(App $app, $middlewares = [])
  19. {
  20. $this->app = $app;
  21. foreach ($middlewares as $middleware) {
  22. $this->queue[] = $this->buildMiddleware($middleware);
  23. }
  24. }
  25. public static function make(App $app, $middlewares = [])
  26. {
  27. return new self($app, $middlewares);
  28. }
  29. /**
  30. * 调度管道
  31. * @return Pipeline
  32. */
  33. public function pipeline()
  34. {
  35. return (new Pipeline())
  36. ->through(array_map(function ($middleware) {
  37. return function ($request, $next) use ($middleware) {
  38. [$call, $params] = $middleware;
  39. if (is_array($call) && is_string($call[0])) {
  40. $call = [$this->app->make($call[0]), $call[1]];
  41. }
  42. return call_user_func($call, $request, $next, ...$params);
  43. };
  44. }, $this->queue));
  45. }
  46. /**
  47. * 解析中间件
  48. * @param mixed $middleware
  49. * @return array
  50. */
  51. protected function buildMiddleware($middleware): array
  52. {
  53. if (is_array($middleware)) {
  54. [$middleware, $params] = $middleware;
  55. }
  56. if ($middleware instanceof Closure) {
  57. return [$middleware, $params ?? []];
  58. }
  59. if (!is_string($middleware)) {
  60. throw new InvalidArgumentException('The middleware is invalid');
  61. }
  62. return [[$middleware, 'handle'], $params ?? []];
  63. }
  64. }