FAQ Suchen Synapsis Wiki Projekte Mitgliederliste Benutzergruppen Profil Einloggen, um private Nachrichten zu lesen Registrieren Login

[PHP] Ideensammlung: Pluginarchitektur

 
Neues Thema eröffnen   Neue Antwort erstellen    Syncom.org Foren-Übersicht -> Interpretersprachen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
PhP0Kid
Profi-Benutzer


Anmeldedatum: 05.01.2007
Beiträge: 403
Wohnort: Ellwangen (nahe Aalen)
Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)

BeitragVerfasst am: 31.03.2008, 14:04    Titel: [PHP] Ideensammlung: Pluginarchitektur Antworten mit Zitat

Hi,

da Faktotum und ich die letzten Wochen fleißig auf der Suche nach der Non-plus-Ultra-Lösung einer Pluginarchitektur sind, hier einmal eine Ideensammlung zu einer solchen.

Was ist eine Pluginarchitektur?
Das ist ein Modell / ein Konzept / ein Bauplan / eine Struktur, die es ermöglicht durch eine vorhandene Basis sicher und effizient PlugIns / AddOns / Module anzufügen. Dieses Anfügen soll so benutzerfreundlich wie möglich sein (vllt. komplett über ein Interface des CMS / Forum / sonstigem Script), somit auch sehr leicht zu handhaben, leicht zu löschen, sollte mit anderen Modulen (installierten) interagieren können, leicht konfigurierbar und schließlich auch sehr sicher sein.


Wie kann eine Pluginarchitektur aussehen?
Zunächst entspricht ein solches System meist einem dynamischen include, den man auch hier finden kann. Dabei kommen aber nun aber einige Schwierigkeiten hinzu. Ein Modul besteht aus einer oder mehreren Dateien, die in sich ein geschlossenes System bilden. Um jedoch mit anderen Modulen kommunizieren zu können, müssen sie Informationen zu diesen haben. Jedes Modul muss also Informationen an einer festgelegten Stelle im Gesamtsystem hinterlegen, auf das alle zugreifen können, um interagieren zu können. Ein Datenbanksystem hat den Nachteil, dass man beispielsweise an eine Datenbank gebunden ist, deshalb würde ich persönlich Konfigurationsdateien wie .ini oder gleich eine .php vorschlagen. Dabei ergibt sich aber der Nachteil des Auslesens und auch Konfigurierens.


Es sind also vor allem folgende Punkte, die streitfällig sind:

  • Wo werden die Informationen (Pfad, Name, ..) zu Modulen hinterlegt?
  • Auf welche Weise werden die Module eingebunden? (Plugin-Klasse, Plugin-Einbinde-Funktion, einfacher include)
  • Wie werden Module installiert und verwaltet? (eigenes Modul? festes System?)



Bin gespannt auf eure Ideen & Vorschläge!


lG

_________________
PHP-Programmierer aus Leidenschaft.
_________________


http://www.Julian-Stier.de | T-REx 2.2
Aktuelles ( 5.5.08 ):
* CMS, Julian-Stier.de - September 2008
* T-REx 2.3.0 - 2. Quartal 2008
* GlobalIndustry - release 2009
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Faktotum
Benutzer


Anmeldedatum: 13.12.2007
Beiträge: 33
Wohnort: /home/krisi
Programmiersprachen: alles mögliche, nix perfekt

BeitragVerfasst am: 31.03.2008, 16:18    Titel: Antworten mit Zitat

Oh, gut dass du die Sache hier mal ansprichst.

Ich hab' mir heut nochmal Gedanken gemacht..

Idee: Ein System das auf Sockets und Modulen basiert. Ein Socket ist eine Art library, die Funktionen zur Verfügung stellt (z.B. Datenbankanwendungen, User-Management, XML-Interpreter,...), realisiert z.B. durch Objekte. Ein Modul dagegen ist ein 'agierendes' Script, das Informationen verarbeitet und aufbereitet (z.B. die Ausgabe einer Webseite, ein Besucherzähler, Gästebuch, Suchfunktion, .....).
Die Frage ist jetzt wie diese Sockets und Module in der Praxis zusammenarbeiten sollen. Ich dachte dabei z.B. an eine Art Vererbungsstruktur: Bei jedem Scriptaufruf wird zunächst das Root-Modul eines Projekts geladen. Dieses bindet dann alle global wichtigen Sockets ein. Nun entscheidet das Root-Modul anhand der übergebenen Parameter, was getan werden soll und bindet dementsprechend Module ein (hier sollte auch die Möglichkeit der Rückmeldung gegeben sein -> Untermodul bearbeitet Anfrage und liefert Ergebnis an Root zurück, Root entscheidet was nun eingebunden werden soll ...). DIese Module 'gehören' dem Root-Modul und können auf alle von ihm erzeugten Sockets zugreifen (Vererbung von Zugriffsrechten!). Genauso soll jedes Modul das unterhalb von Root liegt seinerseits wiederum eigene Kindmodule einbinden können. Jedes Modul kann Sockets instanzieren und weitere Module aufrufen. Ein Modul kann auf alle von ihm und von seinem Muttermodul eingebundenen Sockets zugreifen. Dafür muss natürlich irgendwo im Speicher ein Stammbaum für die Module hiterlegt sein. Jedes Modul sollte so klein wie möglich gehalten werden, also nur einen sehr kleinen Funktionsumfang besitzen, damit es möglichst universell einsetzbar ist. Bei der Modulinstallation muss natürlich eine Abhängigkeitsprüfung erfolgen (D.h. alle Module, auf die das Modul zugreift müssen installiert sein).

Warum das ganze?
Nun, ich dachte man könnte damit vllt eine Art Plattform aufbauen, mit der sich sehr einfach und sehr schnell verschiedene Projekte realisieren lassen. Evtl. könnte man sogar eine Grafische Oberfläche für die API entwickeln, sodass man auf einfache weise komplexe Anwendungen aufbauen kann. Es geht einfach darum, andauernd wiederkehrende Systemteile in Module zu packen und diese frei verfügbar zu machen.


Ich hoffe das war nicht zu viel, wenn was unklar ist, einfach fragen!
Ich werde in den nächsten Tagen mal n Diagramm zeichnen und irgendwie verfügbar machen, um das ganze auch mal grafisch 'rüberzubringen

lg Kristian

_________________
Linux 4 ever !
------
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
thorn
Benutzer


Anmeldedatum: 23.09.2007
Beiträge: 49
Wohnort: Niederried b.K. (CH)
Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB

BeitragVerfasst am: 02.04.2008, 01:47    Titel: Antworten mit Zitat

hmm... das, was ihr hier ansprecht, hab ich neulich über das Osterwochenende zusammengecodet Mr. Green
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Faktotum
Benutzer


Anmeldedatum: 13.12.2007
Beiträge: 33
Wohnort: /home/krisi
Programmiersprachen: alles mögliche, nix perfekt

BeitragVerfasst am: 02.04.2008, 12:07    Titel: Antworten mit Zitat

oh, wunderbar.
Dann kannst du uns doch bestimmt ein bisschen was darüber erzählen, oder?

_________________
Linux 4 ever !
------
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
thorn
Benutzer


Anmeldedatum: 23.09.2007
Beiträge: 49
Wohnort: Niederried b.K. (CH)
Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB

BeitragVerfasst am: 03.04.2008, 22:25    Titel: Antworten mit Zitat

Nun... ich arbeite recht simpel - am einfachsten wäre es wohl, wenn ich den Code präsentieren würde (bei so wenigen Funktionen ist das recht übersichtlich)

Der Code ist jedoch etwas auf mein Projekt zugeschnitten, aber vielleicht ist auch dies im Sinne von euch?

Zur veranschaulichung, erst einmal Grundlegendes:
Ich habe einen Kern, der immer und überall geladen wird - der Kern beinhaltet die Grundfunktionen sowie die Sessioneinstellungen etc.
Es gibt mehrere, voneinander unabhängige, Seiten, die über denselben Kern laufen.
Jede Seite kann auf Module vom Kern oder von der Seite selbst zugreifen...

Und nun etwas erläutert:
Der Kern besteht aus einer Datei z.b. globalconfig.php, welche von jeder Seite eingebunden wird.
Innerhalb dieser Datei werden alle Funktionen geladen sowie routineaufrufe getätigt - in meinem Fall wäre dies folgende Sachen:
- Datenbankverbindung herstellen
- Konfiguration von der Datenbank laden (die Konfiguration könnte auch Dateibasiert geschehen - in meinem Fall wird die DB eigentlich immer benötigt und für den Ausfall dieser plane ich ein Backup-System)
- Funktionen definieren (eine Reihe verschiedener Dateien mit verschiedenen Funktionen)
- Eingaben absichern (GET,POST,COOKIE)
- Session einrichten (bei mir erfolgt die Session über ein Cookie)
- Wenn Benutzer eingeloggt, dessen Umgebung laden

Bei einer Seite gibt es ebenfalls eine config.php, in dieser wird ein Präfix für die Datenbank gesetzt, damit die Tabellen auseinander gehalten werden. Ebenfalls wird ein Systemname gesetzt (Seitenname) zur identifizierung der Seite, wenn es mehrere gibt.

Module sind folgendermassen aufgebaut:
modul($name,$returnstring,$zusatzparameter)
$name bezeichnet den Modulnamen - es wird zuerst nach einem Modul im aktuellen System gesucht, wenn kein Erfolg im Kern (also übergeordnete Struktur) und wenn nichts gefunden wird, schliesst die Funktion mit einem false.
$returnstring beinhaltet die Ausgabe aus dem Modul (näheres dazu später)
$zusatzparameter sind Einstellungen, Trigger etc. die manuell für ein Modul gesetzt werden können um ein anderes Ergebnis zu erhalten als bei einem normalen Aufruf.

Die meisten Module erzeugen irgendetwas, was auf der Seite angezeigt werden soll... ich habe mir dabei ein System ausgedacht, was ich ein wenig bei Joomla abgeschaut habe.
Es gibt die Möglichkeit ein "mastertemplate" zu erstellen - darin werden entsprechende Bereiche markiert.
Eine Funktion masterTemplate() liest mir dieses Template ein und wertet es aus - für jeden definierten Bereich wird aus der DB die entsprechende Liste geladen, mit den einzelnen Modulen, die an dieser stelle angezeigt werden soll (so z.b. ein Menü oder eine Umfrage oder die aktuellste News)
Jedes Modul wird einzeln abgearbeitet, dessen Ausgabe wird in einem String gespeichert und dann an die entsprechende Position im mastertemplate gesetzt.

Die Template-Engine sollte Julian bereits kennen und ich mag ihm da jetzt keine Konkurenz machen (ausserdem kann das sowieso jeder selber machen *g*)

Die index.php ist also recht klein gehalten... ohne Start- und Schluss-Tags sind das gerade mal 6 Zeilen, der Rest kann alles über die Module geregelt werden...
Code:
require_once('./config.php');
if(isset($_GET['page']) && !empty($_GET['page']))
   modul($_GET['page'],$_CONTENT['content']);
else
   modul('default',$_CONTENT['content']);
masterTemplate();

Und auch das könnte man noch in eine Funktion stecken und den Inhalt der config in die index schreiben... 3 Zeilen Mr. Green

Reicht das erstmal? Rolling Eyes

PS: Ach ja, zum Thema Klassen noch etwas... Ich habe auf einen Objektorientierten Aufbau verzichtet, da mir die Funktionen die ich mir selbst zur verfügung gestellt habe, ausreichen. Ebenso die eigene Datenbank-Applikation, wenn man dies so nennen darf, besteht nur aus Funktionen und nicht aus einem Objekt.
Für mich kommt es letztendlich auf das gleiche raus, wenn ich dies:
$db->query("SELECT...");
$data = $db->getRows();
oder das mache:
$data = getRows(query("SELECT..."));

Um das System nicht zum Einsturz zu bringen, gilt es einfach ein paar Variablen zu beachten, die nicht benutzt werden dürfen. Jene besitzen aber eine besondere Bezeichnung wie etwa $_CONTENT

Ein Modul wird innerhalb einer Funktion includet - es sind lediglich die Variablen erreichbar, die Superglobal sind oder welche durch global zugänglich gemacht wurden, dies beschränkt sich aber auf die Userdaten und die Configs... somit ist es ohne Probleme möglich, ein Modul innerhalb eines anderen Moduls zu laden und anzeigen zu lassen, wo immer man es gerade möchte... Smile
(Nur sollte man keinen Loop machen... hab noch nicht geschaut was passiert, wenn man sich selber includet - in XSLT wird das abgefangen...in PHP? )
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Faktotum
Benutzer


Anmeldedatum: 13.12.2007
Beiträge: 33
Wohnort: /home/krisi
Programmiersprachen: alles mögliche, nix perfekt

BeitragVerfasst am: 03.04.2008, 22:55    Titel: Antworten mit Zitat

hey, klingt interessant.

Wenn ich das richtig verstanden habe, gibt es kein richtiges Index-File das einfach immer aufgerufen wird, sondern jede Datei includet ein Script mit den System-Funktionen?

Ich verfolge da ein etwas anderes Konzept. Wäre es nicht auch sinnvoll ein festes Einstiegsscript zu haben, das dann per Konfiguration und anhand der übergebenen Parameter entscheidet, welche module es laden soll? Vllt hab ich diech auch nur falsch verstanden... Ich bin gerade daran den Ablauf wie ich ihn mir vorstelle mal grafisch darzustellen. Hab nur in den letzten Tagen wenig zeit dafür gehabt...

gn8, Kristian

_________________
Linux 4 ever !
------
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
thorn
Benutzer


Anmeldedatum: 23.09.2007
Beiträge: 49
Wohnort: Niederried b.K. (CH)
Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB

BeitragVerfasst am: 04.04.2008, 20:21    Titel: Antworten mit Zitat

nicht ganz... es gibt eigentlich nur eine indexfile und an die wird halt ein entsprechenden parameter (PAGE) übergeben...

aber jedes system lädt die grundfunktionen und agiert gleich wie jedes andere, einfach mit erweiterten modulen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Shadow
Neuer Benutzer


Anmeldedatum: 19.07.2007
Beiträge: 8

Programmiersprachen: XHTML, CSS, Javascript, PHP, SQL, Delphi

BeitragVerfasst am: 03.05.2008, 20:50    Titel: Antworten mit Zitat

Sehr interessantes Thema. Ich stehe selbst auch vor dem Problem, eine möglichst ideale Pluginarchitektur zu realisieren. Ein Ansatz wurde ja schon beim FooBoard vorgestellt und dieser bildet eure Vorstellungen zimelich genau in objektorientierter Form ab. Einzig die Trennung von Sockets und Modulen ist dort nicht sehr strikt geregelt. Die Verschachtelung von Modulen wird durch die von mir vorgestellte Erweiterung des MVC durch eine geschachtelte, in der Anzahl der Ebenen jedoch nicht beschränkte Implementierung des PAC erreicht.
Ich werde mir zu dem Ganzen noch mal Gedanken machen, da ich wirklich nur zu gut weiß, wie schwer die Realisierung eines so feinkörnigen, flexiblen Lego-Systems ist. Wir haben allerdings beim FooBoard schon viele Ideen dazu gesammelt und erörtert, vielleicht könnt ihr daraus ein paar Schlüsse ziehen.
Hilfreich könnte auch ein Blick auf die KParts Struktur von KDE sein, die insbesondere in den Programmen Konqueror und Systemsettings Anwendung findet und genau den Einbau von Modulen zeigt.

_________________
= tsgaming @ Funpic.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
thorn
Benutzer


Anmeldedatum: 23.09.2007
Beiträge: 49
Wohnort: Niederried b.K. (CH)
Programmiersprachen: PHP, MySQL, (X)HTML, CSS, JS, C, VB

BeitragVerfasst am: 05.05.2008, 08:26    Titel: Antworten mit Zitat

könntest du denn einen Link zu diesem Forum reinstellen? Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PhP0Kid
Profi-Benutzer


Anmeldedatum: 05.01.2007
Beiträge: 403
Wohnort: Ellwangen (nahe Aalen)
Programmiersprachen: PHP, CSS, (X)HTML, SQL, JavaScript, C++ (nach Erfahrung von links nach rechts)

BeitragVerfasst am: 05.05.2008, 14:18    Titel: Antworten mit Zitat

http://trilobyte.tr.funpic.de/phpbb/index.php
_________________
PHP-Programmierer aus Leidenschaft.
_________________


http://www.Julian-Stier.de | T-REx 2.2
Aktuelles ( 5.5.08 ):
* CMS, Julian-Stier.de - September 2008
* T-REx 2.3.0 - 2. Quartal 2008
* GlobalIndustry - release 2009
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Syncom.org Foren-Übersicht -> Interpretersprachen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Anhänge in diesem Forum nicht anhängen.
Du kannst Dateien in diesem Forum nicht herunterladen.



Powered by php B. B. © 2001, 2005 php B. B. Group
Template xabbBlue für php B. B. Foren - created by php b. b. styles
Modified by synapsis
Protected by CTracker