routes = new RouteCollection(); } public function run(): void { // get defined routes $routeFiles = []; $routeFiles = Hook::applyFilter("Router::getRouteFiles", $routeFiles); foreach ($routeFiles as $routesFile) { /** @var RoutesDefinitionInterface $routesDefinition */ $routesDefinition = include $routesFile; $routes = $routesDefinition->get(); foreach ($routes as $route) { /** @var Route[] $route */ if (! is_null($this->routes->get($route->getName()))) { throw new \Exception("Route \"{$route->getName()}\" already defined."); } $this->routes->add($route->getName(), $route); } } $request = Request::createFromGlobals(); $response = new Response(); // set semantically correct request method if ($request->get("_method", false)) { $request->setMethod($request->get("_method")); } $matcher = new UrlMatcher($this->routes, new RequestContext()); $match = $matcher->matchRequest($request); /** @var Response $response */ $response = call_user_func_array($match["_"]["action"], [$request]); $response->send(); } }