PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP - Modulare Programmierung


Kinman
2007-07-31, 09:45:43
Hi, mich würde interessieren, wie es am geschicktesten ist ein PHP Programm so modular aufzubauen, das der User selbst Module downloaden und installieren kann.
So wie z.B. bei der Software Gallery2

Natürlich könnte ich mir den PHP Code dieser Gallery ansehen (was ich sicher auch noch machen werde) aber vielleicht habt ihr ein paar Infos oder Links zu diesem Thema.

Danke, mfg Kinman

darph
2007-07-31, 10:16:31
Quick'n'Dirty: Du hast ein Verzeichnis für Plugins. Dort liest du dann per Loop jede PHP-Datei ein und includierst die. Der Pluginautor legt darin eine Klasse an, die sich dann über eine von dir bereitgestellte Methode registriert. Die Klasse muß ein von dir bereitgestelltes Interface implementieren. Nutzt der Autor mehr Dateien, kann er die in ein Unterverzeichnis packen.


<?php
class myPlugin implements IPlugin {

public function __construct() {

}

// implemented interface
public function install() {
// Tabellen anlegen, config erstellen
}

// implemented interface
public function activate() {
// Irgendwelche Flags setzen
}

// implemented interface
public function deactivate() {
// Irgendwelche Flags anders setzen
}

// implemented interface
public function uninstall() {
// drop tables, delete configs
}


// eigene Funktionen
}

$pluginLoader = PluginLoader::getInstance();
$pluginLoader->register(new myPlugin());
?>



Oder so.

Kinman
2007-07-31, 11:31:47
Soweit, so klar, danke!

Was ich nicht ganz verstehe, ist wie man dann die Methoden (der Plugin-Klasse) aufrufen lässt.
Meiner Meinung nach müsste man dazu bestehende Dateien so umschreiben, das die Methoden aufgerufen werden.

Beispiel:
Ich habe ein Newsscript und binde mittels Modul eine BBCode Funktion ein.

beim Ausgeben der News müsste dann statt


$inhalt = mysqlresult(...);
echo($inhalt);


so aussehen


$inhalt = mysqlresult(...);
$inhalt = $BBCode->decode($inhalt);
echo($inhalt);


Nur ein Beispiel, so würd ich prinzipiell nicht machen, aber zum Verstehen sollts reichen

mfg Kinman

darph
2007-07-31, 11:41:38
Ich hatte mal Filter gehabt, die sowas ähnliches gemacht haben. Das lief über Hooks. Jede relevante Stelle, die irgendwas tut, hat einen Hook - eigentlich nur ein Name as String. Die Plugins haben sich für den Hook registriert, für den sie etwas tun. Also obiges erweitern:

$pluginLoader = PluginLoader::getInstance();
$pluginLoader->register("hookName", new myPlugin(), "methodName");

Wird Methodenname nicht angegeben, wird eine Standardmethode aufgerufen, execute() zum Beispiel.

Dann:

<?php
$pluginHandler = PluginHandler::getInstance();

$text = "Wer das liest, ist ein Arschloch.";
$text = $pluginHandler->filter("texthook", $text);

// ********

class PluginHandler {

public function filter($hook, $content) {

foreach($registeredPlugins as $plugin) {
if ($hook == $theHookThatThePluginIsRegisteredTo) {
$content = $plugin->execute($content); // oder der Name, der als Parameter aufgerufen wurde. Das geht in PHP sogar.
}
}

return $content
}
}

?>


Yay for Pseudocode. In der execute-Methode wird nun "ein Arschloch" mit str_replace oder so ersetzt durch "doof". Raus kommt also "Wer das liest, ist doof".

Kinman
2007-07-31, 13:08:46
Das ist mal ein Ansatz!
Super, vielen Dank

mfg Kinman