renderer = new VenomRenderer($this); Asset::get()->setRenderer($this->renderer); } public function run(): void { $arguments = ArgumentHandler::get(); $arguments->setItem(ErrorHandler::ERROR_KEY, false); // we need to load the current controller and the current start template. // after this we can start the renderer if (Config::getInstance()->isRouterEnabled()) { $status = $this->useRouter(); if ($status['found']) { if ($status['status']) { exit(0); } ErrorHandler::setFatalError(); } } $registry = Registry::getInstance(); $registry->getLang()->initLang(); // if site is errored then dont load via SEO if (!$arguments->getItem(ErrorHandler::ERROR_KEY)) { $registry->getSeo()->loadSite(); } $this->renderer->init($this->findController()); $this->renderer->render(); } private function useRouter(): array { $url = URLHelper::getInstance()->getUrl(); /** @var Router $router */ foreach ($this->routers as $router) { $route = $router->findRoute($url, $_SERVER['REQUEST_METHOD']); $status = $router->tryFunctionCall($route); if ($route !== null) { return ['found' => true, 'status' => $status]; } } return ['found' => false, 'status' => true]; } private function findController(): ?RenderController { $cl = ArgumentHandler::get()->getItem('cl'); if ($cl !== null && isset($this->controllers[$cl])) { return $this->loadController($this->controllers[$cl]); } return null; } public function loadController($controllerClass): ?RenderController { $controller = new $controllerClass; if ($controller instanceof RenderController && $controller->register()) { return $controller; } return null; } public function initModules(array $modules): void { foreach ($modules as $key => $moduleClass) { $module = new $moduleClass; if ($module instanceof Module && $module->register()) { $this->modules[$key] = $module; } } } public function initControllers(array $controllers): void { $this->controllers = $controllers; } public function addRouter(string $name, Router $router): void { $this->routers[$name] = $router; } }