Middleware.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace Src;
  3. use FastRoute\RouteCollector;
  4. use FastRoute\RouteParser\Std;
  5. use FastRoute\DataGenerator\MarkBased;
  6. use FastRoute\Dispatcher\MarkBased as Dispatcher;
  7. use Src\Traits\SingletonTrait;
  8. class Middleware
  9. {
  10. //Используем трейт
  11. use SingletonTrait;
  12. private RouteCollector $middlewareCollector;
  13. public function add($httpMethod, string $route, array $action): void
  14. {
  15. $this->middlewareCollector->addRoute($httpMethod, $route, $action);
  16. }
  17. public function group(string $prefix, callable $callback): void
  18. {
  19. $this->middlewareCollector->addGroup($prefix, $callback);
  20. }
  21. //Конструктор скрыт. Вызывается только один раз
  22. private function __construct()
  23. {
  24. $this->middlewareCollector = new RouteCollector(new Std(), new MarkBased());
  25. }
  26. //Поиск middlewares по адресу
  27. private function getMiddlewaresForRoute(string $httpMethod, string $uri): array
  28. {
  29. $dispatcherMiddleware = new Dispatcher($this->middlewareCollector->getData());
  30. return $dispatcherMiddleware->dispatch($httpMethod, $uri)[1] ?? [];
  31. }
  32. //Запуск всех middlewares
  33. public function go(string $httpMethod, string $uri, Request $request): Request
  34. {
  35. return $this->runMiddlewares($httpMethod, $uri, $this->runAppMiddlewares($request));
  36. }
  37. //Запуск всех middlewares для текущего маршрута
  38. private function runMiddlewares(string $httpMethod, string $uri, Request $request): Request
  39. {
  40. //Получаем список всех разрешенных классов middlewares из настроек приложения
  41. $routeMiddleware = app()->settings->app['routeMiddleware'];
  42. //Перебираем все middlewares для текущего адреса
  43. foreach ($this->getMiddlewaresForRoute($httpMethod, $uri) as $middleware) {
  44. $args = explode(':', $middleware);
  45. //Создаем объект и вызываем метод handle
  46. $request = (new $routeMiddleware[$args[0]])->handle($request, $args[1] ?? null) ?? $request;
  47. }
  48. //Возвращаем итоговый request
  49. return $request;
  50. }
  51. //Запуск всех глобальных middlewares
  52. private function runAppMiddlewares(Request $request): Request
  53. {
  54. //Получаем список всех разрешенных классов middlewares из настроек приложения
  55. $routeMiddleware = app()->settings->app['routeAppMiddleware'];
  56. //Перебираем и запускаем их
  57. foreach ($routeMiddleware as $name => $class) {
  58. $args = explode(':', $name);
  59. $request = (new $class)->handle($request, $args[1] ?? null) ?? $request;
  60. }
  61. return $request;
  62. }
  63. }