Reformatting the Boostrap class.

This commit is contained in:
Ilya Bakhlin 2021-12-28 20:49:37 +01:00
parent ff46d1f1e5
commit 545be21dbf

View file

@ -1,137 +1,134 @@
<?php declare(strict_types=1); <?php
require_once(dirname(__FILE__) . "/../vendor/autoload.php");
declare(strict_types = 1);
use Tracy\Debugger; use Tracy\Debugger;
define("CHANDLER_VER", "0.0.1", false); define("CHANDLER_VER", "0.0.1", false); // IMPROVE: Remove this.
define("CHANDLER_ROOT", dirname(__FILE__) . "/..", false); define("CHANDLER_ROOT", dirname(__FILE__) . "/..", false); // IMPROVE: Remove this.
/** /**
* Bootstrap class, that is called during framework starting phase. * Bootstrap class, that is called during framework starting phase.
* Initializes everything. * Initializes everything.
* *
* @author kurotsun <celestine@vriska.ru> * @author kurotsun <celestine@vriska.ru>
* @internal * @internal
*/ */
class Bootstrap class Bootstrap
{ {
/** /**
* Starts Tracy debugger session and installs panels. * Defines constant CONNECTING_IP, that stores end user's IP address.
* * Uses X-Forwarded-For if present.
* @internal *
* @return void * @return void
* @internal
*/
private function defineIP(): void
{
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$path = explode(", ", $_SERVER["HTTP_X_FORWARDED_FOR"]);
$ip = $path[0];
} else {
$ip = $_SERVER["REMOTE_ADDR"];
}
define("CONNECTING_IP", $ip, false);
}
/**
* Bootstraps extensions.
*
* @return void
* @internal
*/
private function igniteExtensions(): void
{
Chandler\Extensions\ExtensionManager::i();
}
private function loadConfig(): void
{
if (!file_exists($conf = CHANDLER_ROOT . "/chandler.yml"))
if (!file_exists($conf = CHANDLER_ROOT . "/../chandler.yml"))
if (!file_exists($conf = "/etc/chandler.d/chandler.yml"))
exit("Configuration file not found... Have you forgotten to rename it?");
define("CHANDLER_ROOT_CONF", chandler_parse_yaml($conf)["chandler"]);
}
/**
* Set ups autoloaders.
*
* @return void
* @internal
*/
private function registerAutoloaders(): void
{
spl_autoload_register(function ($class): void {
if (strpos($class, "Chandler\\") !== 0) return;
require_once(str_replace("\\", "/", str_replace("Chandler\\", CHANDLER_ROOT . "/chandler/", $class)) . ".php");
}, true, true);
}
/**
* Starts Tracy debugger session and installs panels.
*
* @return void
* @internal
*/ */
private function registerDebugger(): void private function registerDebugger(): void
{ {
Debugger::enable((CHANDLER_ROOT_CONF["debug"] ? Debugger::DEVELOPMENT : Debugger::PRODUCTION), __DIR__ . "/../logs"); Debugger::enable((CHANDLER_ROOT_CONF["debug"] ? Debugger::DEVELOPMENT : Debugger::PRODUCTION), __DIR__ . "/../logs");
Debugger::getBar()->addPanel(new Chandler\Debug\DatabasePanel); Debugger::getBar()->addPanel(new Chandler\Debug\DatabasePanel);
} }
private function loadConfig(): void
{
if(!file_exists($conf = CHANDLER_ROOT . "/chandler.yml"))
if(!file_exists($conf = CHANDLER_ROOT . "/../chandler.yml"))
if(!file_exists($conf = "/etc/chandler.d/chandler.yml"))
exit("Configuration file not found... Have you forgotten to rename it?");
define("CHANDLER_ROOT_CONF", chandler_parse_yaml($conf)["chandler"]);
}
/** /**
* Loads procedural APIs. * Loads procedural APIs.
* *
* @internal
* @return void * @return void
* @internal
*/ */
private function registerFunctions(): void private function registerFunctions(): void
{ {
foreach(glob(CHANDLER_ROOT . "/chandler/procedural/*.php") as $procDef) foreach (glob(CHANDLER_ROOT . "/chandler/procedural/*.php") as $procDef)
require $procDef; require $procDef;
} }
/** /**
* Set ups autoloaders. * Starts router and serves request.
* *
* @internal * @param string $url Request URL
*
* @return void * @return void
*/
private function registerAutoloaders(): void
{
spl_autoload_register(function($class): void
{
if(strpos($class, "Chandler\\") !== 0) return;
require_once(str_replace("\\", "/", str_replace("Chandler\\", CHANDLER_ROOT . "/chandler/", $class)) . ".php");
}, true, true);
}
/**
* Defines constant CONNECTING_IP, that stores end user's IP address.
* Uses X-Forwarded-For if present.
*
* @internal * @internal
* @return void
*/ */
private function defineIP(): void private function route(string $url): void
{ {
if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { ob_start();
$path = explode(", ", $_SERVER["HTTP_X_FORWARDED_FOR"]); $router = Chandler\MVC\Routing\Router::i();
$ip = $path[0]; if (($output = $router->execute($url, null)) !== null)
} else { echo $output;
$ip = $_SERVER["REMOTE_ADDR"]; else
} chandler_http_panic(404, "Not Found", "No routes for $url.");
ob_flush();
define("CONNECTING_IP", $ip, false); ob_end_flush();
flush();
} }
/** /**
* Initializes GeoIP, sets DB directory. * Initializes GeoIP, sets DB directory.
* *
* @internal
* @return void * @return void
* @internal
*/ */
private function setupGeoIP(): void private function setupGeoIP(): void
{ {
geoip_setup_custom_directory(CHANDLER_ROOT . "/3rdparty/maxmind/"); geoip_setup_custom_directory(CHANDLER_ROOT . "/3rdparty/maxmind/");
} }
/**
* Bootstraps extensions.
*
* @internal
* @return void
*/
private function igniteExtensions(): void
{
Chandler\Extensions\ExtensionManager::i();
}
/**
* Starts router and serves request.
*
* @internal
* @param string $url Request URL
* @return void
*/
private function route(string $url): void
{
ob_start();
$router = Chandler\MVC\Routing\Router::i();
if(($output = $router->execute($url, NULL)) !== null)
echo $output;
else
chandler_http_panic(404, "Not Found", "No routes for $url.");
ob_flush();
ob_end_flush();
flush();
}
/** /**
* Starts framework. * Starts framework.
* *
* @internal
* @return void * @return void
* @internal
*/ */
function ignite(bool $headless = false): void function ignite(bool $headless = false): void
{ {
@ -140,8 +137,7 @@ class Bootstrap
$this->loadConfig(); $this->loadConfig();
$this->registerDebugger(); $this->registerDebugger();
$this->igniteExtensions(); $this->igniteExtensions();
if (!$headless) {
if(!$headless) {
header("Referrer-Policy: strict-origin-when-cross-origin"); header("Referrer-Policy: strict-origin-when-cross-origin");
$this->defineIP(); $this->defineIP();
$this->route(function_exists("get_current_url") ? get_current_url() : $_SERVER["REQUEST_URI"]); $this->route(function_exists("get_current_url") ? get_current_url() : $_SERVER["REQUEST_URI"]);