Skip to content

Commit

Permalink
Merge pull request #14 from alllinux/v1.0.0
Browse files Browse the repository at this point in the history
V1.0.0
  • Loading branch information
alllinux authored Feb 27, 2024
2 parents cb55aa5 + 16c1a08 commit 68f8408
Show file tree
Hide file tree
Showing 7 changed files with 350 additions and 122 deletions.
182 changes: 182 additions & 0 deletions core/c/auto.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
<?php
namespace Nibiru\Auto;
/**
* Class Auto
* @project core
* @desc This is a PHP class file, please specify the use
* @author stephan - Nibiru Framework
* @date 27.02.24
* @time 13:35
* @package Nibiru\Auto
*/
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use RegexIterator;
use Nibiru\Config;
use Nibiru\View;
class Auto
{
const SETTINGS_SECTION = "AUTOLOADER";
const DB_MODEL_FOLDER = "dbmodel";
const SETTINGS_MODULE_SELECTOR = "module";
const SETTINGS_CLASS_POS = "class.pos";
const SETTINGS_TRAIT_POS = "trait.pos";
const FILTER_TRAIT_NAME = "traits";
const SETTINGS_IFACE_POS = "iface.pos";
const FILTER_INTERFACE_NAME = "interfaces";
const SETTINGS_CLASS_PLUGIN_POS = "class.plugin.pos";
const FILTER_CLASS_PLUGIN_NAME = "plugins";
const REGEX_PATH_NAME = "[NAME]";
private array $configSettingsSection = [];
private array $configAutoloaderSection = [];
private static ?object $_instance = null;
private string $modelFolderPath;
private string $moduleFolderPath;

/**
* @desc Singleton instance
*/
private function __construct()
{
$this->_set('configSettingsSection', Config::getInstance()->getConfig()[View::NIBIRU_SETTINGS]);
$this->_set('configAutoloaderSection', Config::getInstance()->getConfig()[self::SETTINGS_SECTION]);
$this->_set('modelFolderPath', $this->_get('configSettingsSection')[self::DB_MODEL_FOLDER]);
$this->_set('moduleFolderPath', $this->_get('configSettingsSection')[self::SETTINGS_MODULE_SELECTOR]);
}

/**
* @desc Singleton instance
* @return Auto
*/
public static function loader(): Auto
{
$className = get_called_class();
if( self::$_instance === null )
{
self::$_instance = new $className();
}
return self::$_instance;
}

/**
* @desc will set a given property for this class
* @param string $name
* @param $value
* @return void
*/
protected function _set(string $name, $value): void
{
try {
$_class_properties = get_class_vars(__CLASS__);
if (array_key_exists($name, $_class_properties))
{
$this->$name = $value;
}
} catch (\Exception $e) {
error_log("Exception in _set method: " . $e->getMessage());
} catch (\Error $e) {
error_log("Error in _set method: " . $e->getMessage());
}
}
/**
* @desc will return the value of the requested property
* @param string $name
* @return mixed
*/
protected function _get(string $name): mixed
{
try {
$_class_properties = get_class_vars(__CLASS__);
if (array_key_exists($name, $_class_properties))
{
return $this->$name;
}
} catch (\Exception $e) {
error_log("Exception in _get method: " . $e->getMessage());
} catch (\Error $e) {
error_log("Error in _get method: " . $e->getMessage());
}
}

/**
* @desc Generic method to load files based on a given path and file pattern.
* @param string $basePath The base path where the files are located.
* @param string $pattern The regex pattern to match the files.
* @return void
*/
public function loadFiles(string $basePath, string $pattern = '/^.+\.php$/i')
{
$directoryIterator = new RecursiveDirectoryIterator($basePath);
$iterator = new RecursiveIteratorIterator($directoryIterator);
$phpFiles = new RegexIterator($iterator, $pattern, \RecursiveRegexIterator::GET_MATCH);

foreach ($phpFiles as $file) {
require_once $file[0];
}
}

/**
* @desc Load all PHP model files from the specified directory.
* @return void
*/
public function loadModelFiles()
{
$this->loadFiles(__DIR__ . $this->_get('modelFolderPath'));
}

/**
* @param $moduleName
* @param $componentType
* @param $registeredComponents
* @return void
*/
protected function loadModuleComponents($moduleName, $componentType, $registeredComponents): void
{
foreach ($registeredComponents as $componentName) {
$componentBasePath = str_replace(self::REGEX_PATH_NAME, '', __DIR__ . $this->_get('moduleFolderPath')) . $moduleName;
if ($componentType === self::FILTER_TRAIT_NAME || $componentType === self::FILTER_CLASS_PLUGIN_NAME || $componentType === self::FILTER_INTERFACE_NAME)
{
$componentPath = $this->determineComponentPath($componentName, $componentBasePath, $componentType);
} else {
$componentPath = $componentBasePath . '/' . $componentType . '/' . $componentName . '.php';
}

// Load the component if the file exists
if (file_exists($componentPath))
{
require_once $componentPath;
}
}
}

// Example method to determine the path for special traits and plugins
protected function determineComponentPath($componentName, $componentBasePath, $componentType)
{
// Placeholder logic to determine the correct path for traits and plugins
// You might need to implement additional logic based on your framework's structure
// For example, you might have a mapping or convention that relates component names to modules
return $componentBasePath . '/' . $componentType . '/' . $componentName . '.php';
}

/**
* Load modules by utilizing the generic loadFiles method.
* @return void
*/
public function loadModules(): void
{
$registeredModules = $this->_get('configAutoloaderSection')[self::SETTINGS_CLASS_POS];
$modulePath = str_replace(self::REGEX_PATH_NAME, '', __DIR__ . $this->_get('moduleFolderPath'));

foreach ($registeredModules as $moduleName) {
$moduleMainFile = $modulePath . $moduleName . '/' . $moduleName . '.php';
$this->loadModuleComponents($moduleName, self::FILTER_INTERFACE_NAME, $this->_get('configAutoloaderSection')[self::SETTINGS_IFACE_POS]);
$this->loadModuleComponents($moduleName, self::FILTER_TRAIT_NAME, $this->_get('configAutoloaderSection')[self::SETTINGS_TRAIT_POS]);
if (file_exists($moduleMainFile))
{
require_once $moduleMainFile;
}

$this->loadModuleComponents($moduleName, 'plugins', $this->_get('configAutoloaderSection')[self::SETTINGS_CLASS_PLUGIN_POS]);
}
}
}
1 change: 1 addition & 0 deletions core/c/autoloader.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
* User: kasdorf
* Date: 10.11.17
* Time: 09:44
* @deprecated - this class is deprecated, use the auto autoloader instead (c/auto.php)
*/
class Autoloader
{
Expand Down
7 changes: 4 additions & 3 deletions core/c/dispatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
*/

namespace Nibiru;
use Nibiru\Autoloader\Autoloader;
require_once __DIR__ . '/../c/autoloader.php';
use Nibiru\Auto\Auto;
require_once __DIR__ . '/../c/auto.php';

final class Dispatcher
{
Expand Down Expand Up @@ -38,7 +38,8 @@ public function run()
}
Router::getInstance();
Router::getInstance()->route();
Autoloader::getInstance()->runRequireOnce();
Auto::loader()->loadModelFiles();
Auto::loader()->loadModules();
if(is_file(__DIR__ . '/../../application/controller/' . Router::getInstance()->tplName() . 'Controller.php'))
{
require_once __DIR__ . '/../../application/controller/' . Router::getInstance()->tplName() . 'Controller.php';
Expand Down
Loading

0 comments on commit 68f8408

Please sign in to comment.