Hallo zusammen,
ich bin neu hier und hoffe ich hab das richtige Unterforum erwischt, in den Anfänger-Bereich passt das vielleicht nicht?
Den grundsätzlichen Inspirationsschub für dieses DI-Konzept habe ich in diesem Thread bekommen. Genauer, in der zweiten Antwort von Combie.
Seinen Ansatz habe ich jetzt etwas erweitert, um dynamisch weitere installierte Module nachzuladen und ihnen automatisiert benötigte Objekte zu übergeben.
Es funktioniert alles, darum geht es also nicht. Mich würde mehr interessieren ob das Konzept noch Schwächen, z.B. in Sachen Performance, hat, welche ich aktuell noch übersehe.
Hier mal die relevanten Code-Teile für die Klassen-Verwaltung:
Es funktioniert soweit prima. Aber wie gesagt, vielleicht entdeckt jemand in dem Konzept noch Schwachstellen, dann freue ich mich über eine Antwort.
ich bin neu hier und hoffe ich hab das richtige Unterforum erwischt, in den Anfänger-Bereich passt das vielleicht nicht?
Den grundsätzlichen Inspirationsschub für dieses DI-Konzept habe ich in diesem Thread bekommen. Genauer, in der zweiten Antwort von Combie.
Seinen Ansatz habe ich jetzt etwas erweitert, um dynamisch weitere installierte Module nachzuladen und ihnen automatisiert benötigte Objekte zu übergeben.
Es funktioniert alles, darum geht es also nicht. Mich würde mehr interessieren ob das Konzept noch Schwächen, z.B. in Sachen Performance, hat, welche ich aktuell noch übersehe.
Hier mal die relevanten Code-Teile für die Klassen-Verwaltung:
PHP-Code:
// index.php
require_once "./classes/ffcms.class.php";
$ffcms = new ffcms();
$ffcms->run();
// ffcms.class.php (extends diRegistry)
public function run() {
$this->buildContent->run();
}
protected function di_db() {
$db = new MySQLi(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if(mysqli_connect_errno()) die("Verbindung zur Datenbank konnte nicht hergestellt werden.");
$this->db = $db;
return $db;
}
protected function di_user() {
$user = new user($this->db);
$this->user = $user;
return $user;
}
protected function di_modules() {
$this->modules = new modules($this);
return $this->modules;
}
protected function di_buildContent() {
$buildContent = new buildContent($this);
$this->buildContent = $buildContent;
return $buildContent;
}
// diRegistry.class.php
protected $values = array();
public function __set($id,$value) {
$this->values[$id] = $value;
}
public function __get($id) {
if(isset($this->values[$id]))
return $this->values[$id];
return $this->di($id);
}
protected function di($element) {
$di = array($this,'di_'.$element);
if(is_callable($di)) {
return call_user_func($di);
} elseif($this->modules->isInstalled($element)) {
$this->values[$element] = $this->modules->loadModule($element);
return $this->values[$element];
}
throw new InvalidArgumentException("Can not create $element");
}
// modules.class.php
class modules {
private $ffcms;
public function __construct(ffcms $ffcms) {
$this->ffcms = $ffcms;
}
public function isInstalled($module) {
$sql = "SELECT isInstalled FROM module WHERE name=?";
$res = $this->ffcms->db->prepare($sql);
$res->bind_param('s',$module);
$res->bind_result($isInstalled);
$res->execute();
if($res->fetch() && $isInstalled) {
$res->free_result();
if(is_dir("./modules/".$module) && file_exists("./modules/".$module."/".$module.".class.php") {
return true;
}
}
return false;
}
public function loadModule($module) {
require_once "./modules/".$module."/".$module.".class.php";
$object = new $module();
$sql = "SELECT class FROM module_requires WHERE module_id=(SELECT id FROM module WHERE name=?)";
$res = $this->ffcms->db->prepare($sql);
$res->bind_param('s',$module);
$res->bind_result($class);
$res->execute();
while($res->fetch()) {
$object->$class = $this->ffcms->$class;
}
return $object;
}
}
// core.class.php
public function run_test() {
$this->ffcms->test->test();
}
// ./modules/test/test.class.php
class test {
private $db;
private $user;
public function test() {
print_r($this->db);
print_r($this->user);
}
public function __set($id,$element) {
if(!isset($this->$id)) $this->$id = $element;
}
}

Kommentar