109 lines
3.1 KiB
PHP
Executable File
109 lines
3.1 KiB
PHP
Executable File
<?php
|
|
|
|
|
|
namespace Venom;
|
|
|
|
|
|
use Venom\Core\ArgumentHandler;
|
|
use Venom\Core\Config;
|
|
use Venom\Core\Module;
|
|
use Venom\Core\Registry;
|
|
use Venom\Exceptions\ExceptionHandler;
|
|
use Venom\Helper\ErrorHandler;
|
|
use Venom\Helper\URLHelper;
|
|
use Venom\Routing\Router;
|
|
use Venom\Views\Asset;
|
|
use Venom\Views\RenderController;
|
|
use Venom\Views\VenomRenderer;
|
|
|
|
class Venom
|
|
{
|
|
private VenomRenderer $renderer;
|
|
private array $controllers = [];
|
|
private array $modules = [];
|
|
private array $routers = [];
|
|
|
|
public function __construct()
|
|
{
|
|
ExceptionHandler::setExceptionHandler();
|
|
$this->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;
|
|
}
|
|
} |