diff options
Diffstat (limited to 'src/web/core/loader.php')
-rw-r--r-- | src/web/core/loader.php | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/web/core/loader.php b/src/web/core/loader.php new file mode 100644 index 0000000..b0a1cbd --- /dev/null +++ b/src/web/core/loader.php @@ -0,0 +1,111 @@ +<?php /* Copyright (c) 2024 Freya Murphy */ +class Loader { + + // keep track of what has been loaded + private $loaded; + + // the database + private $db; + + function __construct() { + $this->loaded = array(); + } + + /** + * Loads a $type of object from a $dir with a given $name + * @param string $name - the name of the object to load + * @param string $dir - the directory theese objects are stored in + * @param string $type - the type of the object + */ + private function load_type($name, $dir, $type): object|NULL { + $path = $dir . '/' . $name . '.php'; + if (array_key_exists($path, $this->loaded)) { + return $this->loaded[$path]; + } + + if (!file_exists($path)) { + return NULL; + } + + $parts = explode('/', $name); + $part = end($parts); + $class = ucfirst($part) . '_' . $type; + require($path); + + $ref = NULL; + try { + $ref = new ReflectionClass($class); + } catch (Exception $_e) {} + + if ($ref === NULL) { + return NULL; + } + + $obj = $ref->newInstance($this); + $this->loaded[$path] = $obj; + + return $obj; + } + + /** + * Loads a model + * @param string $name - the name of the model to load + */ + public function model($name): object|NULL { + $root = $GLOBALS['webroot']; + $dir = $root . '/_model'; + return $this->load_type($name, $dir, 'model'); + } + + /** + * Loads a controller + * @param string $name - the name of the controller to load + */ + public function controller($name): Controller|NULL { + $root = $GLOBALS['webroot']; + $dir = $root . '/_controller'; + return $this->load_type($name, $dir, 'controller'); + } + + /** + * Loads the given common lang + */ + public function lang(): void { + $dir = $GLOBALS['webroot'] . '/lang/'; + $lang = $GLOBALS['lang']; + if ($handle = opendir($dir)) { + while (false !== ($entry = readdir($handle))) { + if ($entry === '.' || $entry === '..' || $entry === 'apps') { + continue; + } + $path = $dir . $entry; + require($path); + } + } + $GLOBALS['lang'] = $lang; + } + + /** + * Loads a given app specific lang + * @param string $name - the name of the app + */ + public function app_lang($name): void { + $dir = $GLOBALS['webroot'] . '/lang/apps/'; + $file = $dir . $name . '.php'; + if (file_exists($file)) { + $lang = $GLOBALS['lang']; + require($dir . $name . '.php'); + $GLOBALS['lang'] = $lang; + } + } + + public function db() { + if ($this->db) { + return $this->db; + } else { + $this->db = new DatabaseHelper(); + return $this->db; + } + } + +} |