Middleware.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. public function runMiddlewares(string $httpMethod, string $uri): Request
  28. {
  29. $request = new Request();
  30. //Получаем список всех разрешенных классов middlewares из настроек приложения
  31. $routeMiddleware = app()->settings->app['routeMiddleware'];
  32. //Перебираем все middlewares для текущего адреса
  33. foreach ($this->getMiddlewaresForRoute($httpMethod, $uri) as $middleware) {
  34. $args = explode(':', $middleware);
  35. //Создаем объект и вызываем метод handle
  36. (new $routeMiddleware[$args[0]])->handle($request, $args[1] ?? null);
  37. }
  38. //Возвращаем итоговый request
  39. return $request;
  40. }
  41. //Поиск middlewares по адресу
  42. private function getMiddlewaresForRoute(string $httpMethod, string $uri): array
  43. {
  44. $dispatcherMiddleware = new Dispatcher($this->middlewareCollector->getData());
  45. return $dispatcherMiddleware->dispatch($httpMethod, $uri)[1] ?? [];
  46. }
  47. }