| | | | |
| |||||||
| PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | ||||
| Erfahrener Benutzer | Zitat:
Beispiel einer potentiellen CMS-Realisierung: Das CMS ist ein eigenes Plugin, was beispielsweise vom zentralen Script per Methode aufgerufen wird, um eine Webseite anzuzeigen. Die Webseiten sind entsprechend hinterlegt (Templates, wie auch immer) und fordern die BusinessObjects und -Logik von anderen Plugins (beispielsweise einem User-Management) an. Und das über genau jene Schnittstelle "GetInterface()". Wenn sich die Plugin-Verwaltung bereits darauf spezialisieren würde und wie ein "CMS" funktionieren würde, wäre es eigentlich schon wieder zu aufgebläht, um als Framework-Basis zu dienen. Gut, ist eine Philosophiefrage aber genau darum geht es mir ja, zu erkennen, ob meine Philosophie gut ist oder nicht Zitat:
Erst danach gehts auseinander, da eine Paketierung vom Ansatz her bei mir nicht eingeplant ist. Eine Paketierung zur Strukturierung der Plugins ist sicherlich sinnvoll. Um zu steuern, welche Plugins wann geladen werden, eher überflüssig, da ich wie dargestellt, auch Plugins selber On-Demand lade (beim ersten Verwenden). Das, was du im Paketmanager realisierst, bietet meine Plugin-Verwaltung und das Plugin ist selbstverantwortlich, ob beispielsweise alle Klassen geladen werden oder erst bei Anfrage nach speziellen Interfaces etwas geladen wird. Die Frage nach dem Huhn oder dem Ei, beispielsweise bei Sessions, habe ich bislang noch nicht zufriedenstellend gelöst, das gebe ich zu. Das merkte ich, als ich vorab auf einem Schmierzettel und im Kopf ein Konzept für ein Cms entwickeln wollte. Die Treiber-Frage ist sicherlich eine besondere, weil du da immer auf eine BlackBox schaust. Sinnvollerweise kennst du aber etwas, was die BlackBox bedienen kann. Entweder du kennst Interfaces, die du selbst bedienen kannst und gleichzeitig ein Objekt, was dir den Einstieg bietet oder das Framework kennt den Einstieg. Rein vom Ansatz her finde ich es besser (und flexibler), wenn das Framework grundsätzlich nichts von irgendwelchen Datenbanken o.ä. weiss. Daher eher der Ansatz, dieses Hilfskonstrukt "DBManager" nicht in die Plugin-Verwaltung zu integrieren, sondern als Plugin. Spricht aber nichts dagegen, beispielsweise zusätzlich Kategorien aufzubauen, also den anderen Weg zu ermöglichen: Ein Plugin registriert sich für die Kategorie "DBTreiber" und das Plugin "DBManager" kriegt mit: Neues Plugin und kann dann reagieren. Als aussenstehende Anwendung rufst du DBManager::GetConnection() auf. Bei deinem Ansatz rufst du eine Methode im Paketmanager auf, um eine Datenbank-Verbindung aufzubauen und den zugehörigen Treiber zu laden, soweit ich das sehe. Zitat:
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih | |||
| | |
| | |
| Erfahrener Benutzer |
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih |
| | |
| | ||||
| Erfahrener Benutzer Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse: Fortgeschritten ![]() | Zitat:
Zitat:
Zitat:
Basti PS: Ich stelle es mir übrigens ein wenig schwierig vor eine solche Anwendung mit lauter PlugIns zu modellieren, oder wie sähe das aus? Du hast ja nachher lauter Subsysteme, die miteinander Kommunizieren, anstatt dass du die Zusammenhänger der Klassen/Objekte direkt abbilden kannst, oder lieg ich da falsch. PPS: Mir fiel gard ein, in der CoWiki-Dokumentation was von wegen "alles ist ein PlugIn" gelesen zu haben. Ist dort wohl aber auch wiederum in eine andere Richtung: http://cowiki.org/130.html#A2 | |||
| | |
| | |
| Erfahrener Benutzer | Ich muss mir den Link einmal angucken. Das wichtige ist vielleicht der grundsätzliche Gedankenansatz, der vielleicht mit reinspielt. Ich betrachte das ganze ebend nicht in der klassischen Weise oder aus Request-Sicht. Das Cms, was sich für die Präsentation verantwortlich fühlen wird, ist aus Sicht einer echten Anwendung hin modelliert. Das heisst zu deutsch: Es gibt bei mir zumindest im Framework keine Sicht auf Sessions oder Requests. Das ist ein Detail, was das Cms generiert, um die Anwendung im Browser zu präsentieren. Die Plugins kümmern sich darum gar nicht. Ich wollte im Cms echte Anwendungen modellieren und entsprechende transparente Modelle für Client (Browser) und Server, sowie Anwendungsbezogene Business-Logik. Vielleicht geht es auch in Richtung Ajax, was das Cms daraus generieren wird, mal gucken... Ich hab da schon so einige Ideen und nach dem, was du oben geschrieben hast, ist mir noch eine hinzugekommen
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih |
| | |
| | |
| Erfahrener Benutzer | Hmmm. In einem Punkt bin ich schonmal richtig ins Grübeln gekommen: Ich habs wohl irgendwie falsch erklärt. Nochmal ganz von vorne. Betrachten wir das nicht PHP-spezifisch. Die Intention ist eine spezielle Betrachtungsweise einer "Webseite". Die typisch Webseite unterliegt einem starrem oder klassischem Konzept. Ausgehend von J2EE oder meinetwegen auch Ajax lässt sich dieses Konzept aufweichen und wir gelangen zu einem völlig neuen Blickwinkel, wenn wir es konsequent machen: Das Anwendungsmodell Wenn man einmal alles als ganzes betrachtet, haben wir einen Client-Teil und einen Server-Teil einer verteilten Anwendung. Wodurch zeichnet es sich aus? Das Anwendungsmodell wird nicht nur als ganzes betrachtet, sondern auch als solches entwickelt und betrieben. Wir lösen uns vom klassischen Gedanken an eine Webseite, die durch Klicken auf einen Button oder Link eine neue Webseite lädt. Die Webseite dient lediglich der Präsentation der Anwendung, die im Browser und im Webserver läuft. Die Komponenten, die diese Präsentation bestimmen, sind als Komponenten zu sehen und nicht als Webseiten. Das, was der User dann zu Gesicht bekommt, ist eine "echte" Anwendung, auch vom Funktionsumfang her. Popup-Dialoge, Panels, Layouts usw. Ob das ganze dann im Ergebnis als Webseite mit Links zum Klicken realisiert wird oder als das, was man im allgemeinen heute unter dem Ajax-Konzept versteht, interessiert die ApplicationLogik nicht. Für die Anwendung aus Server-Sicht ist wichtig, wann der Benutzer mit ihr interagiert und was der Benutzer will, nicht wirklich, auf welche Weise er das macht. Es soll eine Anwendung A (meinetwegen ein Live-Newssystem) auch überhaupt nicht interessieren, was der Benutzer gerade in Anwendung B so treibt. Die Anwendung A soll laut Definition in der Lage sein, auch im Browser im Hintergrund weiterzulaufen und bei Bedarf eine Live-Nachricht hochzupoppen. Hierbei liegt der Schwerpunkt natürlich nicht auf der Webseite, sondern auf der Anwendung. Würde man dererlei Konzepte in einem klassischen, seitenbasierendem Template-System realisieren, stößt du sehr schnell an deine natürliche Grenzen, ganz einfach weil die Templates derart komplex werden, dass du sie nicht mehr warten kannst. Für den Bereich des Backends magst du das noch struktrieren können in gezielt aufgebaute und eingesetzte Businessobjekte und -Logik. Aber wie sieht sowas als "Webseite" aus? Aus diesem Grund beschäftigt sich der Grundgedanke des Frameworks genau mit diesem Punkt in einem großen Zusammenhang. Willst du dir multiple Systeme und Subsysteme oder Module oder Komponenten (ich nenns Plugins), die vielleicht nur sehr triviale Sachen gemeinsam haben (meinetwegen Benutzerlogin), in einer ganzeinheitlichen Anwendung integrieren, stößt du immer wieder auf die gleichen Probleme. Immer wieder musst du dafür sorgen, dass deine Templates Dinge berücksichtigen, die vielleicht gar nichts darin zu suchen habe. Nehmen wir einmal genau das Beispiel mit einer hochpoppenden Nachricht eines im Hintergrund ablaufenden Nachrichtensystems. Wie schnell hat man das in die Templates einer bestehenden Webseite integriert, dass ein eingeloggter User live Nachrichten empfangen kann, die hochgepoppt werden (und zwar nicht als JavaScript alert?) Was das bedeuten könnte, wäre klar. Also macht man es nicht, sondern sucht sich andere Lösungen (javascript->alert) oder einen eigens dafür vorbereiteten Bereich im Design, wo dann ein kleiner Message-Bereich auftaucht usw. Das bedeutet aber im Ergebnis: Du richtest deine Bedürfnisse nach deiner Anwendung aus und nicht deine Anwendung nach deinen Bedürfnissen. Das mag jetzt kleinkariert klingen aber Beispiele, wo man aufgrund der starren Struktur einer klassischen Webseite Kompromisse schliesst, kennen wir alle mehr als genügende. "Weils halt im Internet so ist." Und? Ausgehend von diesem Problem habe ich mir gesagt, dass es doch möglich sein muss, genau solche Denkansätze mal wegzulassen. Es muss doch möglich sein, genau deswegen mal wegzukommen von dieser Betrachtungsweise. Was wäre, wenn wir obiges Beispiel nehmen könnten und eine unsichtbare Komponente definieren (völlig losgelöst ob da was in der Webseite auftaucht oder nicht), die, sobald eine Nachricht für den User eintrifft, ein HTML-Element mit dieser Nachricht einblendet, so dass der User sie sieht. Dabei soll es völlig schnurzpiep egal sein, was mit dem aktuellen Design ist, denn wir wollen ja eine Art "Popup-Nachricht". Es soll völlig egal sein, was der User aktuell gerade getrieben hatte. Klickt er die Nachricht weg, kann er mit der angefangenen Arbeit fortfahren. Und jetzt in PHP Dieses Beispiel nehmen wir jetzt und realisieren es als PHP-Framework, wobei wir uns noch viele Gedanken über Verallgemeinerungen machen. Klingt stark nach Ajax, wobei ich persönlich das Wort Ajax erst in diesem Zusammenhang in den Mund nehmen werde, wenn es um die tatsächliche Präsentation geht. Denn Ajax ist nur ein kleiner (wenn auch ev. wichtiger) Bestandteil eines solchen Konzepts. Es beschreibt eine mögliche Lösung für die Ablaufsteuerung im Browser und die Kommunikation der verteilten Anwendung, nicht aber den Rundumschlag, den ich erreichen will. Das Grundkonzept sollte nun denke ich (oder hoffe ich) irgendwie klar geworden sein. Genau dieses Grundknzept nehme ich nun und zerlege ich in Teilprobleme. Eines dieser Teilprobleme ist die Steuerung der Modularisierung, womit wir wieder beim Anfang wären und meinen Gedanken zu "Plugins". Das ganze natürlich ziemlich wiederverwertbar, was bedeutet, dass man diese relativ einfache Plugin-Steuerung auch gut für andere Zwecke verwenden kann, da sie vom Rest des Frameworks nicht abhängig sein wird. Gut, was ich mitgenommen habe ist schonmal folgendes: - Nach genauerem Überlegen ist der Name "Plgugin" eventuell etwas unglücklich gewählt für das, was es beschreibt. Modul trifft es ev. etwas besser und klarer. - Eine Gruppierung jeglicher Art wäre zur Steigerung der Übersicht und Handhabbarkeit vielleicht gar nicht schlecht. Sei die Gruppierung nun technisch oder fachlich motiviert. - Spezielle Plugins oder Module sollten noch einmal gesondert betrachtet werden. Der Einwand mit den Treibern trifft es oben ziemlich gut. Das ist sicherlich nicht glücklich gelöst, wenn man es dabei belässt. Vielleicht sollte das Plugin-System durchaus noch einige Spezialisierungen zu besonderen Arten von Plugins oder Modulen bieten können. Auch wenn es nicht Intention des ganzen ist, wird das Framework auch in der Lage sein, als (eventuell aufgeblähtes) CMS-System für klassische Webseiten (seien sie dynamisch oder nicht) dienen zu können. Das hat auch einen einfachen Hintergrund: Es gibt auch für solche Verteilte Anwendungen immer auch genügend "Nicht-dynamische" Bereiche. Also die klassischen Informationsseiten, Impressum etc. Der Einfachheit halber sollte man hier nie den Weg verbauen, auch HTML-Bereiche einbinden zu können. Das ist aber nur als Randnotiz zu verstehen und nicht erklärtes Ziel. Modellbetrachtung Hier habe ich noch nicht für eine Vorgehensweise entschieden. Zunächst einmal gibt es zwei mögliche Varianten, die es zu diskutieren gäbe. a) Getrennte Modelle für Client und Server. Server und Client greifen auf unterschiedliche Modelle zu, die selbstverantwortlich synchronisert werden müssen. Das heisst, dass eine Benutzerinteraktion (Bestätigen eines Formulars als klassisches Beispiel), die eine Modelländerung veranlasst, dann beispielsweise per XML zum Server kommuniziert wrden muss, der entsprechend die Änderungen vornimmt. Das wäre jetzt das Bild von AJAX. Nachteil des ganzen ist, dass teilweise unnötiger Overhead erzeugt wird während der Entwicklung, da man sich auch um Belange der Synchronisation (und damit der Kommunikation) kümmern müsste. b) Geteilte Modelle. Deutlich eleganter für viele Aufgaben finde ich eine Lösung, die ein geteiltes Modell zulässt. Das heisst, dass man das Modell Live verändern kann und entsprechend auf Server und Client synchron gehalten wird. c) Der Kompromiss Die wohl beste Art, Daten zu verwalten, ist die Kombination aus beiden Varianten. Das Datenmodell kann berücksichtigen, dass es synchron gehalten werden kann aber nicht muss. Daten, die so nur auf dem Client verfügbar sind und nur dort gebraucht wird, sollen auch dort verbleiben. Gleiches gilt für den Server. Wenn man aber Daten hat, die sowohl auf Client als auch auf Server existieren, sollte man sie ohne weiteres Zutun bei Bedarf synchronisieren können. Man stelle sich beispielhaft eine JavaScript-Methode vor, die "synchronizeToServer" heisst bzw. "synchronizeFromServer" und eine entsprechende PHP-Methode. Beispiel zum Modell: Man stelle sich eine Art Wizard vor. Ich denke jeder weiss, was ein Wizard darstellt. Dieser Wizard zeichnet sich dadurch aus, dass er ein Modell komplett bearbeitet aber in mehreren Schritten. Jederzeit ist ein "Vor" und ein "Zurück", sowie ein "Abbrechen" und ggf. ein "Speichern" möglich. Betrachtet aus einer Webseite wird dies eine Kaskade aus Webseiten, Session-Verwendung u.ä. Betrachtet man es allerdings als Anwendung, wird die Komponente "Wizard" mit den einzelnen Wizard-Seiten definiert. Am Client wird ein Modell definiert und immer weiter bearbeitet. Es mit Abspeichern des Wizards wird das Modell zum Server übertragen und im Server-Teil der Anwendung verarbeitet. so far.... Vielleichts wird ein bischen verstänlicher mit diesem etwas längeren Post...
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Design und Code Trennen | TeazY | PHP Tipps 2008 | 29 | 21.05.2008 12:08 |
| Anschaffung eines Editors, diverse Fragen | notyyy | Off-Topic Diskussionen | 12 | 30.11.2007 16:02 |
| Design | Beitragsarchiv | 26 | 04.06.2005 20:56 | |
| Problem mit *.TPL dateien und Design | imported_DJ Nuno | HTML, Usability und Barrierefreiheit | 4 | 08.03.2005 02:29 |
| [PHP] Design Schutz für ein Gästebuch | I-Spy | PHP Tipps 2005 | 5 | 01.01.2005 11:25 |
| [Erledigt] Fragen über Fragen... wer kann helfen? | PHP Tipps 2004 | 2 | 08.07.2004 21:12 | |
| Design an PHPnuke oder TriggerTG anpassen?? | PHP Tipps 2004 | 5 | 11.06.2004 15:29 | |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| php5 konzept plugin, framework plugin steuerungstool, php framework rollenverwaltung, rollenverwaltung server 2008 framework, telefonnummer martin eisengardt,pfinztal, name eisengardt, applicationcontroller::request |

Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.