php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.09.2004, 00:14  
Benutzer
 
Registriert seit: 05.09.2004
Beiträge: 72
/tmp
Standard Umsetzung eines Pluginsystems

Also, ich bin gerade dabei ein größeres Projekt in PHP neu umzusetzen.
Dabei würde es sich anbieten, mit Plugins zu arbeiten.
Leider konnte mir Google nicht mit irgendwelchen Design Pattern, o.ä. dienen, daher die Frage hier:
Wie setze ich das am besten um?

Dabei gehts eigentlich nicht um den codespezifischen Teil.
Daher poste ich auch ins Profi-Forum: require, call_user_func und die ganzen Späße kenne ich. Geht ruhig davon aus, dass ich alle relevanten (auch php spezifischen) Kniffe kenne.

Bei mir haperts nur an einer Idee zur Architektur.
Prinzipiell muss ich ja in der Lage sein, jede Funktion durch nahezu beliebigen Code zu erweitern.

Welche Ansätze gibt es da?
Zum Beispiel:
- "Require" ich einfach alle passende Plugins am Ende jeder Methode?
- Wie "registriere" ich Plugins am sinnigsten - sprich: Wie teilt mir das Plugin mit, mit welchen Funktionen es gerne arbeiten will.
- Oder arbeite ich lieber mit Overloading von Klassen?
Fragen über Fragen...

Wie gesagt: Ich suche Designpatterns, Flussdiagramme, Ideen und Konzepte zur Realisierung von Plugins. Die eigentliche technische Umsetzung ist kein Problem.

Vielen Dank schonmal für Eure Bemühungen.
/tmp ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.09.2004, 00:29  
Benutzer
 
Registriert seit: 05.09.2004
Beiträge: 72
/tmp
Standard

Um vielleicht eine kleine Hilfe zu geben, mal eine total vereinfachte Beispiel Klasse:

Code:
class cBeispiel
{
    var $cArray = array();

    function setArray($array)
    {
        $this->cArray = $array;
    }

    //Gibt das Array getrennt durch $seperator aus
    function printArray($seperator)
    {

        //Ich weiss, implode() hätte es auch getan
        //Aber für Plugins, evt Interessant auf einzelne Elemente
        //zugreifen zu können.
        foreach ($this->cArray as $aElement) {
          $string .= $aElement.$seperator;
        }

        //Den letzten Seperator entfernen
        $string = substr($string, strlen($seperator));
        echo $string;
    }
}

Ein Beispiel Plugin wäre zum Beispiel, dass alle Werte, die "Test" enthalten, aus $cArray gelöscht werden, bevor es ausgegeben wird.
Oder ne RegExp die über jedes Element laufen muss, bevor es ausgegeben wird.

Nur mal als Ansatz für die Überlegungen.
Ich hoffe, die Fragestellung ist nicht zu komplex
/tmp ist offline   Mit Zitat antworten
Alt 06.09.2004, 00:30  
Gast
 
Beiträge: n/a
Standard Re: Umsetzung eines Pluginsystems

hey...
kannst du im detail nicht noch ein bisschen genauer erläutern, was dein plugin-system machen soll - einfach der besseren vorstellung halber: was soll ein plugin bei dir z.B. machen ?

Zitat:
Zitat von /tmp
- "Require" ich einfach alle passende Plugins am Ende jeder Methode?
wie meinst am ende ? - du requirest deine plugins standard-mäßig beim start der index.php - am besten du packst alle in ein verzeichnis, parset dieses (aber das wird dir ja klar sein *g*)

Zitat:
Zitat von /tmp
- Wie "registriere" ich Plugins am sinnigsten - sprich: Wie teilt mir das Plugin mit, mit welchen Funktionen es gerne arbeiten will.
warum kann das plugin die benötigten php-dateien nicht einfach include / requiren - dann brauchst du dich darum doch garnicht weiter zu kümmern...

Zitat:
Zitat von /tmp
- Oder arbeite ich lieber mit Overloading von Klassen?
halte ich für sinnvoll

wie gesagt, verrat uns doch noch ein paar details - ohne diese siehts schlecht aus mit flussdiagrammen und co denke ich

greetz
andy
  Mit Zitat antworten
Alt 06.09.2004, 00:38  
Benutzer
 
Registriert seit: 05.09.2004
Beiträge: 72
/tmp
Standard

Hui, so spät noch was los hier...
Anscheinend war ich etwas zu langsam mit meiner Ergänzung, sodass du es noch nicht lesen konntest.
Das wäre ein Beispiel, mit dem wir erstmal arbeiten könnten.
Wie gesagt: Es geht um die Möglichkeiten an sich.

Wieso "require" ich das Plugin am Anfang einer Methode?
Wenn es auf die vorher entstandenen Ergebnisse zugreifen soll (z.B. Datenbankergebnisse), dann muss es doch definitiv danach eingefügt werden.
[EDIT]
Ahh, jetzt verstehe ich, was du meinst.
Naja, das würde die Sache natürlich seeeehr aufplustern, wenn ich erstmal alle Plugins include, auch wenn ich sie nicht brauche.
Ich dachte eher daran, die Plugins nur dann einzubinden, wenn sie auch wirklich gebraucht werden.


Kurz was zum Projekt:
Wird ne SOAP Applikation, die im Prinzip nur Anfragen an ne Datenbank schickt. Die Plugins sollen dann ggf. die Daten noch bearbeiten, bevor sie rausgejagt werden:

SOAP -> Applikation -> Datenbank
Datenbank -> Applikation (Plugins) -> SOAP
[/EDIT
/tmp ist offline   Mit Zitat antworten
Alt 06.09.2004, 00:43  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von /tmp
Anscheinend war ich etwas zu langsam mit meiner Ergänzung, sodass du es noch nicht lesen konntest.
Das wäre ein Beispiel, mit dem wir erstmal arbeiten könnten.
Wie gesagt: Es geht um die Möglichkeiten an sich.
hab deine ergänzung echt später gelesen, auch wenn ich nicht viel schlauer draus geworden bin... - beschreib mal für was für eine art von aktionen du die plugins brauchst - ich muss dir das ganze ein wenig vorstellen können, you know ? - verallgemeinern lässt sich dann immernoch

Zitat:
Zitat von /tmp
Wieso "require" ich das Plugin am Anfang einer Methode?
Wenn es auf die vorher entstandenen Ergebnisse zugreifen soll (z.B. Datenbankergebnisse), dann muss es doch definitiv danach eingefügt werden. Oder liegt ein Missverständnis vor?
dann haben wir uns missverstanden ) - klar erst das requiren was gebraucht wird ... aber wie gesagt, auf sonem allgemein abstrahierten level kann ich nur mitgrübeln, wenn du was mehr von deinem projekt berichtest...

greetz
andy
  Mit Zitat antworten
Alt 06.09.2004, 00:52  
Benutzer
 
Registriert seit: 05.09.2004
Beiträge: 72
/tmp
Standard

lol...diese Foren sind einfach ungeeignet, wenn man direkt ohne Delay kommunizieren will - mit Edit Funktion erst recht

Das Beispiel von oben sollte eigentlich erstmal reichen zur Veranschaulichung (viel kann ich zum dem Projekt an sich nicht sagen, ohne wirklich lange ausschweifen zu müssen und firmeninterna auszuplaudern )

Nehmen wir an, ich will in der foreach Schleife ne Schnittstelle zu nem Plugin geben:
Code:
foreach ($this->cArray as $aElement) { 
    // <--- Insert Plugin here
    $string .= $aElement.$seperator; 
}
Der Plugincode könnte dann wie folgt aussehen:

Code:
//Aus einem Array von 0, 1, 2, 3
// soll 0te, 1te, 2te, 3te... werden.

if($aElement == 1)
   $aElement = "1ste";
else 
   $aElement .= "te";
Dann müsste ich zunächst herausbekommen, welche Plugins an dieser Stelle überhaupt arbeiten wollen und diese dann includen.
Hätte den Vorteil, dass ich wenig Overhead habe (siehe unten), aber den Nachteil, dass ich erstmal Plugins suchen müsste und mir ein System überlegen müsste, wie mir die Plugins mitteilen, an welcher Stelle sie benutzt werden wollen.
Ausserdem wäre die Sache eher unflexibel, weil die Plugins nur an vordefinierten Stellen arbeiten könnten.
Soweit Idee eins.

Zweite Idee wäre, die ganze Methode zu overloaden.
Was dann natürlich ne Menge Overhead geben würde, weil ja die foreach Schleife nochmal ausgeführt werden müsste, um auf einzelne Elemente des Arrays zuzugreifen - und zwar bei jedem Plugin neu!
Problem verstanden?

Wir haben also zur Auswahl: Unflexibilität & Aufwand vs. Overhead & Rechenleistung.
Meine Lieblingslösung wäre Flexibilität & wenig Overhead

[EDIT]
Ich muss erstmal ins Bett, schaue morgen wieder rein.
Danke schonmal!!
[/EDIT]
/tmp ist offline   Mit Zitat antworten
Alt 06.09.2004, 00:59  
Gast
 
Beiträge: n/a
Standard

also entweder du oder ich hat gerade nen knoten im kopp - und ich glaube das is meine wenigkeit .... ich mach mich ma ins bettsche und werd drüber nachgrübeln

trotzdem hast du mir nich verraten, was die plugins machen sollen - die firmeninternas sind mir ziemlich egal - ich weiß nichma für welche firma du arbeitest - und auch wenn hab ich genug eigenen kram... *g*

so ganz sind wir noch nich auf einem nenner, wie gesagt - soll das plugin nen string generieren ??? - meine vorstellungskraft ist begrenzt - gerade zu dieser zeit, also geb uns doch noch ein bissel mehr info als die foreach-schleife...

greetz
andy

ps: bisher sehe ich nämlich noch garkein problem *doof kuck*
  Mit Zitat antworten
Alt 06.09.2004, 10:00  
Benutzer
 
Registriert seit: 05.09.2004
Beiträge: 72
/tmp
Standard

Das mit den Firmeninterna war auch nicht ganz ernst gemeint.
Problem ist, dass es ein sehr umfangreiches Projekt wird und ich noch keine genaue Anforderungsanalyse aufm Tisch habe.
Grundsätzlich wirds ne Art internes Forum (nicht ganz, aber vergleichbar) auf SOAP Basis.
Im Prinzip als Supportplattform auf Intranet Basis mit verschiedenen Frontends. Also Abteilung Buchhaltung hat ein eigenes, autonomes Frontend, Abteilung Support hat eins, Abteilung EDV ebenfalls...
Für jede Abteilung können einzelne User (Mitarbeiter) registriert werden, die entsprechend mit den Beiträgen verknüpft werden.

Frontend <---> SOAP <-> Applikation <-> Datenbank

Ein User schreibt also einen Beitrag. Dieser wird per SOAP an die Applikation geschickt und die packt es in die Datenbank.

Code:
Beitrag ---> Frontend ---> SOAP -> Applikation -> (Plugins) -> Datenbank
Umgekehrt natürlich wenn gelesen wird:

Code:
Datenbankbeitrag -> Applikation -> (Plugins) -> SOAP ---> Frontend
Und natürlich der ganze kleine Schnickschnack.
Und eben diese Kleinigkeiten sollen als Plugin realisiert werden.

Beispiel 1:
Kunde XY holt sich einen Text - sagen wir eine Kalkulation - aus der Datenbank.
Das ist die normale SOAP Anfrage. Ein Plugin könnte dann so aussehen, dass der Text nochmal mit ner RegEx bearbeitet (Platzhalter ersetzen zum Beispiel) oder um Informationen ergänzt wird. Zum Beispiel ne Copyright Zeile.

Beispiel 2:
Ein Kunde XY speichert einen Text - sagen wir eine Notiz.
Ein Plugin könnte sein, dass der Text vorher auf Rechtschreibung überprüft wird und nur dann gespeichert werden darf, wenn alles "clean" ist.

Beispiel 3:
User A wird registriert, also mit ein paar erforderlichen Daten in die Datenbank gepackt. Ein Plugin könnte definieren, welche Daten Pflicht sind und welche nicht.

Soweit ausreichend zum Verständnis?
/tmp ist offline   Mit Zitat antworten
Alt 06.09.2004, 11:08  
Gast
 
Beiträge: n/a
Standard

hi,

so wie ich dich verstehe redest du eher von filtern als von plugins.
ich würde das ganze objekt orientiert aufbauen als einen einfachen
filter chain. die idee dahinter ist eigentlich recht simpel : es gibt einen
filter manager über den du filter registrierst. der manager bekommt dann
die ausgangsdatenquelle zugewiesen und arbeitet seine filter der reihe nach
ab und gibt am ende die modifizierten werte zurück. wie mann das im
detail aufbaut hängt (wie immer) sehr stark von deiner restlichen architektur ab.

hier mal ein kleines beispiel :
PHP-Code:
<?

  
class Datasource
  
{
    var 
$data false;

    function 
Datasource()
    {
    }

    function 
import(&$data)
    {
      
$this->data = &$data;
    }

    function 
importDatasource(&$datasource)
    {
      
$this->data $datasource->data;
    }

    function 
get($name)
    {
      return (isset(
$this->data[$name])) ? $this->data[$name] : null;
    }

    function 
set($name$value)
    {
      
$this->data[$name] = $value;
    }
  }


  class 
Filter
  
{
    function 
Filter()
    {
    }

    function 
execute(&$datasource)
    {
    }
  }


  class 
FilterFormatNumber
  
{
    var 
$decimals 2;

    function 
execute(&$datasource)
    {
      if (
$datasource->get('number1') !== null)
      {
        
$datasource->set('number1',  number_format($datasource->get('number1'), $this->decimals','' '));
      }
    }
  }

  class 
FilterWordWrap
  
{
    var 
$maxWidth 20;

    function 
execute(&$datasource)
    {
      if (
$datasource->get('text1') !== null)
      {
        
$datasource->set('text1',  wordwrap($datasource->get('text1'), $this->maxWidth));
      }
    }
  }


  class 
FilterManager
  
{
    var 
$input false;
    var 
$output false;
    var 
$filter = array();

    function 
FilterManager(&$datasource)
    {
      
$this->input = &$datasource;
      
$this->output = new Datasource();
      
$this->output->importDatasource(&$this->input);
    }

    function 
addFilter(&$filter)
    {
      
$this->filter[] = &$filter;
    }

    function 
execute()
    {
      
$filters count($this->filter);
      for(
$filter=0$filter<$filters$filter++)
      {
        
$this->filter[$filter]->execute(&$this->output);
      }
    }

    function &
getOutput()
    {
      return 
$this->output;
    }
  }


//
// Beispiel
//

  
$input = new Datasource();
  
$input->set('number1'123.5678);
  
$input->set('text1''Zur Ast Satin Blei ums fals Helene Dem, auf ob Baal Irrenhaus brandet Flug Farm, wog Geologen ums, merkt Brutto gekürzter Knies et Gashahn killt Schopfes zur Dottern zerrten Allmacht neigt. Leere Trios, ans Geo zus Atü webt halb Tabake so No. Eher Dufy Belebung bestreit, Brei im Filz hohlen Gelände fache. Bonn zudeckendes Pius vager Big Faltern geb Abart. Alp As Task erregten erb wird als Bhaltis.');

  
$manager = new FilterManager(&$input);

  
$filter1 = new FilterFormatNumber();
  
$manager->addFilter(&$filter1);

  
$filter2 = new FilterWordWrap();
  
$manager->addFilter(&$filter2);

  
$manager->execute();
  
$output = &$manager->getOutput();
  
print_r($output);
?>
gruss
Sike
  Mit Zitat antworten
Alt 06.09.2004, 11:18  
Benutzer
 
Registriert seit: 05.09.2004
Beiträge: 72
/tmp
Standard

Das sieht schon gut aus, allerdings müssen eben diese Filter dynamisch als Plugins genutzt werden können.
Denn je nach Frontend muss ich andere Filter anwenden.
Und es macht keinen Sinn das hart einzucoden.
Bei Bedarf muss ich auch Filter dynamisch nachdefinieren können und das schreit förmlich nach Plugins.

Ausserdem sind die Filter ja nur ein Aspekt der Plugins (wenn auch zugegebenermaßen der wichtigste).
/tmp ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
OOP Umsetzung cycap PHP-Fortgeschrittene 26 17.06.2008 19:13
Kleine "redaktionelle" Umsetzung chrissi0179 PHP Tipps 2008 4 29.04.2008 16:49
Speed anzeige bzw Umsetzung VincentVanWeb PHP Tipps 2008 11 11.03.2008 20:10
Probleme bei der Umsetzung Kein Genie PHP Tipps 2007 3 02.03.2007 15:43
brauche eure hilfe für die umsetzung eines scriptes... GrungeRocker PHP Tipps 2006 12 31.08.2006 11:31
Bin zu blöd zur HTML Umsetzung HTML, Usability und Barrierefreiheit 10 06.03.2006 14:35
register_globals, umsetzung, form, edit sql TimmaY PHP Tipps 2005-2 9 09.08.2005 22:31
[Browsergame] Hilfe bei Umsetzung Beitragsarchiv 28 05.03.2005 09:16
Problem mit Umsetzung einer Funktion Datenbanken 1 20.12.2004 14:37
Hilfe bei Umsetzung Datenbankanwendung PHP Tipps 2004 1 03.11.2004 20:24
"new COM()" -Umsetzung auf Server mit FreeBSD PHP-Fortgeschrittene 14 18.08.2004 10:54

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php plugins umsetzung

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:07 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.