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);
-}