diff --git a/src/Application.php b/src/Application.php index d33251b8..c5b29c8a 100644 --- a/src/Application.php +++ b/src/Application.php @@ -27,19 +27,58 @@ class Application return static::getInstance(); } - private $router = null; - private $templating = null; - private $configuration = null; + public static function gitCommitInfo(string $format): string + { + return trim(shell_exec(sprintf('git log --pretty="%s" -n1 HEAD"', $format))); + } + + public static function gitCommitHash(bool $long = false): string + { + return self::gitCommitInfo($long ? '%H' : '%h'); + } + + public static function gitBranch(): string + { + return trim(shell_exec('git rev-parse --abbrev-ref HEAD')); + } + + private $modules = []; + + public function __get($name) + { + if (starts_with($name, 'has') && strlen($name) > 3 && ctype_upper($name[3])) { + $name = lcfirst(substr($name, 3)); + return $this->hasModule($name); + } + + if ($this->hasModule($name)) { + return $this->modules[$name]; + } + + throw new \Exception('Invalid property.'); + } protected function __construct($config = null) { ExceptionHandler::register(); - $this->router = new RouteCollection; - $this->templating = new TemplateEngine; - $this->configuration = new ConfigManager($config); + $this->addModule('router', new RouteCollection); + $this->addModule('templating', new TemplateEngine); + $this->addModule('config', new ConfigManager($config)); - echo 'hello!'; + $this->templating->addFilter('json_decode'); + $this->templating->addFilter('byte_symbol'); + $this->templating->addFunction('byte_symbol'); + $this->templating->addFunction('session_id'); + $this->templating->addFunction('config', [$this->config, 'get']); + $this->templating->addFunction('route', [$this->router, 'url']); + + echo sprintf( + 'Running on commit %s on branch %3$s!', + self::gitCommitHash(true), + self::gitCommitHash(), + self::gitBranch() + ); } public function __destruct() @@ -51,50 +90,22 @@ class Application { ExceptionHandler::debug($mode); - if ($this->hasTemplating()) { - $this->getTemplating()->debug($mode); + if ($this->hasTemplating) { + $this->templating->debug($mode); } } - public function hasRouter(): bool + public function addModule(string $name, $module): void { - return !is_null($this->router) && $this->router instanceof RouteCollection; - } - - public function getRouter(): RouteCollection - { - if (!$this->hasRouter()) { - throw new \Exception('No RouteCollection instance is available.'); + if ($this->hasModule($name)) { + throw new \Exception('This module has already been registered.'); } - return $this->router; + $this->modules[$name] = $module; } - public function hasTemplating(): bool + public function hasModule(string $name): bool { - return !is_null($this->templating) && $this->templating instanceof TemplateEngine; - } - - public function getTemplating(): TemplateEngine - { - if (!$this->hasTemplating()) { - throw new \Exception('No TemplateEngine instance is available.'); - } - - return $this->templating; - } - - public function hasConfig(): bool - { - return !is_null($this->configuration) && $this->configuration instanceof ConfigManager; - } - - public function getConfig(): ConfigManager - { - if (!$this->hasConfig()) { - throw new \Exception('No ConfigManager instance is available.'); - } - - return $this->configuration; + return array_key_exists($name, $this->modules) && !is_null($this->modules[$name]); } } diff --git a/src/TemplateEngine.php b/src/TemplateEngine.php index cbbd51b5..7300ec6c 100644 --- a/src/TemplateEngine.php +++ b/src/TemplateEngine.php @@ -13,23 +13,6 @@ use Twig_SimpleFunction; */ class TemplateEngine { - /** - * Utility |filters(). - */ - private const UTILITY_FILTERS = [ - 'json_decode', - //'byte_symbol', - ]; - - /** - * Utility functions(). - */ - private const UTILITY_FUNCTIONS = [ - //'route', - //'config', - //'session_id', - ]; - /** * Template file extension. */ @@ -61,14 +44,6 @@ class TemplateEngine 'auto_reload' => false, 'debug' => false, ]); - - foreach (static::UTILITY_FILTERS as $filter) { - $this->addFilter($filter, $filter); - } - - foreach (static::UTILITY_FUNCTIONS as $function) { - $this->addFunction($function, $function); - } } /** @@ -147,11 +122,11 @@ class TemplateEngine private function fixPath(string $path): string { // if the .twig extension if already present just assume that the path is already correct - if (substr($path, 0 - strlen(static::FILE_EXTENSION)) === static::FILE_EXTENSION) { + if (ends_width($path, self::FILE_EXTENSION)) { return $path; } - return str_replace('.', '/', $path) . static::FILE_EXTENSION; + return str_replace('.', '/', $path) . self::FILE_EXTENSION; } /** @@ -162,7 +137,7 @@ class TemplateEngine */ public function render(string $path, array $vars = null): string { - $path = static::fixPath($path); + $path = self::fixPath($path); if ($vars !== null) { $this->vars($vars); @@ -223,6 +198,6 @@ class TemplateEngine */ public function exists(string $path, string $namespace): bool { - return $this->loader->exists('@' . $namespace . '/' . static::fixPath($path)); + return $this->loader->exists('@' . $namespace . '/' . self::fixPath($path)); } } diff --git a/utility.php b/utility.php index 26edfde4..2da54c04 100644 --- a/utility.php +++ b/utility.php @@ -35,6 +35,22 @@ function has_flag(int $flags, int $flag): bool return ($flags & $flag) > 0; } +function byte_symbol($bytes, $decimal = false) +{ + if ($bytes < 1) { + return "0 B"; + } + + $divider = $decimal ? 1000 : 1024; + $symbols = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; + + $exp = floor(log($bytes) / log($divider)); + $bytes = $bytes / pow($divider, floor($exp)); + $symbol = $symbols[$exp]; + + return sprintf("%.2f %s%sB", $bytes, $symbol, $symbol !== '' && !$decimal ? 'i' : ''); +} + function is_int_ex($value, int $boundary_low, int $boundary_high): bool { return is_int($value) && $value >= $boundary_low && $value <= $boundary_high; @@ -74,8 +90,3 @@ function is_int64($value): bool { return is_int_ex($value, -0x8000000000000000, 0x7FFFFFFFFFFFFFFF); } - -function is_uint64($value): bool -{ - return is_int_ex($value, 0x0, 0xFFFFFFFFFFFFFFFF); -}