middlewareCollector->addRoute($httpMethod, $route, $action); } public function group(string $prefix, callable $callback): void { $this->middlewareCollector->addGroup($prefix, $callback); } //Конструктор скрыт. Вызывается только один раз private function __construct() { $this->middlewareCollector = new RouteCollector(new Std(), new MarkBased()); } //Запуск всех middlewares для текущего маршрута public function runMiddlewares(string $httpMethod, string $uri): Request { $request = new Request(); //Получаем список всех разрешенных классов middlewares из настроек приложения $routeMiddleware = app()->settings->app['routeMiddleware']; //Перебираем все middlewares для текущего адреса foreach ($this->getMiddlewaresForRoute($httpMethod, $uri) as $middleware) { $args = explode(':', $middleware); //Создаем объект и вызываем метод handle (new $routeMiddleware[$args[0]])->handle($request, $args[1] ?? null); } //Возвращаем итоговый request return $request; } //Поиск middlewares по адресу private function getMiddlewaresForRoute(string $httpMethod, string $uri): array { $dispatcherMiddleware = new Dispatcher($this->middlewareCollector->getData()); return $dispatcherMiddleware->dispatch($httpMethod, $uri)[1] ?? []; } }