ich hab schon verschiedene kleine und große Projekte in PHP+MySQL+JavaScript realisiert…
Nur waren das immer eigene, abgeschlossene Projekte, welche dann nicht erweiter werden sollten/konnten.
Jetzt wollte ich gern eine Anwendung schreiben, welche auch im nachhinein durch einfaches hinzufügen eines Moduls/Plugins erweitert werden kann.
Wie stelle ich sowas am besten an?
Wo sage ich der Anwendung: Schau hier hin, da findest du alle Plugins.
oder: wenn das, dann lade diese funktionen.
Es muss ja auch für die Module/Plugins möglich sein, zu jeder Zeit an jedem Ort zu funktionieren.
Muss ich mir da eine art Trigger-System einfallen lassen? Z.B. wird bei einem Login ein Trigger ausgelöst. Plugins, welche beim Login wirken sollen, ahlten danach ausschau und legen dann los. oder so in der art?
Ich hab es bisher immer so gemacht, dass ich meinem Hauptobjekt der Anwendung Meine Module einfügen kann durch eine Methode. Als Beispiel
// 1. Argument: Klassenname als String
// 2. Argument: benötigte Argumente als Array
// 3. Argument: Modul für welche Schnittstelle? (zum Beispiel Login oder indem fall für alle)
$mainApp->addPlugin("database",array("localhost","dbuser","dbpassword","dbname"), "All");
Du musst dir dann nur schön Schnittstellen erstellen wo die Module geladen werden.
So mach ich es wenn ich Anwendungen erweitern will
Das Laden ist einfach: Du includest einfach alle Dateien aus einem Ordner. Dann stellen die Plugins entweder Funktionen und Klassen bereit, oder, wie du schon sagtest, nutzen Funktionen deiner Anwendung und verändern Sachen. Oder beides.
jo, das mit dem include aller Dateien hatte ich auch schon überlegt
dabei habe ich so gedacht:
Ein Ordner in den alle Module kommen:
MODULE
Für jedes Modul dann darin einen Ordner:
MODULE/MeinModul
Jedes Modul muss über die Datei function.inc.php verfügen, in dieser stehen dann alle weiteren, modul-spezifischen sachen
Eventuell könnte man da auch immer eine Funktion oder ähnliches einbauen, welche auf Abhängigkeiten prüft (für andere Module)
Mal sehen wie ich das hinbekomme.
Ich stell mir das halt schwer vor, dem Programm dann auch die Möglichkeit zu geben, das Inhalte durch die Module verändert werden etc…:?
Ich würde das Modulverzeichnis per Script durchlaufen und automatisch standardisierte Include-Dateien aller gefundenen Module Includen.
Anders gehts nicht, wenn die Dateien nur hochgeladen und sofort erkannt werden sollen. Ist allerdings recht langsam.
Zur Performancesteigerung würde ich einen Adminbereich erstellen.
Beim Login in den Adminbereich wird der Modul-Ordner gescannt. Im Adminbereich selbst können die zu aktivierenden Module dann ausgewählt werden.
Beim speichern werden die entsprechenden Include-Befehle für die Module erzeugt und in eine Datei (zB. „include_modules.inc.php“) geschrieben.
Im Hauptscript wird einfach nur noch die „include_modules.inc.php“ eingebunden und fertig.
Alle weiteren Aktionen (Inhalte durch Module verändern) können auf eine ähnliche Art und Weise realisiert werden.
Für dein vorhaben muß man ein Routing Script schreiben/erstellen.Die Module sind getrennt daher hat jedes Modul auch seinen eigenen Ordner(Verzeichniss)
Der unterschied bei Plug ins ist das alle Scripte(Module) auf die Plug ins zugreiffen können. Diese stehen dann wieder in einem eigen Ordner der Zentrall definiert wird und bei bedarf die Plug ins ladet.
Ein gutes Beispiel dafür findest du im Zend Framework das hat diese Eigenschaften schon fertig Programmiert.
Willst du so ein Routing aber selber schreiben dann steht noch viel Arbeit vor dir wenn du das Proffesionell und vernüftig schreiben willst.
Du brauchst also kein such script sonderen einen Schematik vernüftigen Aufbau.So das man immer weiß wo was zu finden ist. Ohne das das Script selbst danach suchen muß. Hierbei mußt du auf die Dateiname vergabe sehr genau achten damit das ganze funktioniert.
Ähnlich wie bei der __autoload() funktion werden dann die benötigten Teile nachgeladen.
function hookInit($initArgs)
{
die(‚programm wurde initialisiert‘);
}
dein programm muss natürlich überall hooks haben welche aufgerufen werden, bei einem kleinen cms können das schonmal rund 500 stück werden.
die Plugins leitest du von einer globalen plugin klasse ab, diese stellt die Hook, Datenbank, Debug, … Funktionen. Neben Hooks werden häufig Filter verwendet.
bisher hab ich immer alleine an meinen projekten entwicklet, da waren klassen einfach nicht nötig
letzten endes sind es auch wieder „nur“ funktionen, halt anders verpackt.
Klassen helfen aber auch, wenn du alleine programmierst, da sie modular sind. So habe ich zum Beispiel eine MysqlDatabase Klasse geschrieben, die in verschiedenen Projekten einsetzen kann. Denn Wenn du für jede Klasse eine Datei erstellst, hast du einen Überblick was du an Objekten brauchst. Natürlich lässt sich das auch einigermaßen mit Funktionen umsetzen, dennoch musst du dann darauf acht geben wie du deine Funktionen benennst damit sie nicht doppelt vorkommen. Mit Klassen hingegen, kannst du gut und gerne Methoden definieren, die in anderen Klassen auch existieren. Zum Beispiel wäre es dann möglich eine read-methode in 2 Klassen zu schreiben. Der Umstieg von Funktionen auf Klassen ist zum Glück auch nicht all zu schwer. Denke jeder hier wird dir raten auf OOP umzusteigen.