EventHandler

Dieser Bereich dient dazu, neue Features zu diskutieren und für die Entwicklung zu dokumentieren. // This area is dedicated to new features including proposals and documentation.
welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: EventHandler

Beitrag von welworx » 05.08.2011, 21:30:14

hab leider ein wenig den Überblick zu dem eventhandler verloren ...

rein aus Neugierde: Schon abzusehen wann das ganze fertig ist? ;)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: EventHandler

Beitrag von dr.e. » 06.08.2011, 23:21:39

Hi Ralf,
Ich habe heute für mein CMS eine automatische Generierung der sitemap.xml für Suchmaschinen erstellt. Mein CMS triggert ein spezielles Event, sobald eine neue Seite angelegt wird, oder die Konfiguration einer Seite geändert wurde. Dieses Event möchte ich nutzen, um immer bei Änderung die Sitemap neu zu generieren.
Hier würde dich das Thema Gültigkeit bzw. die Speicherung von Events nochmals als Lösung anbieten. Hast du persistente Events, könntest du in einem Cron-Script den EventHandler z.B. alle 10Min anfragen, ob er ein solches Event hat und dann deine Sitemap neu erstellen. Hast du das Event nicht, braucht der Cron nichts zu tun. Arbeitest du wie aktuell beschrieben nur mit runtime-Events, die maximal in der Session gespeichert sind, hast du keine Chance das zu persistieren bzw. zu entkoppeln.

Vielleicht macht es dann Sinn, zwischen Event, EventDispatcher und EventStorage zu unterscheiden. Ein Storage muss von einem Event definiert und dann an den Dispatcher übergeben werden. Beim registrieren eines Listeners (z.B. im Cron) wird dann das Event gleich gefeuert, weil der Dispatcher es findet und deine Sitemap wird generiert. Klar wie ich das meine?
Jein. Man könnte in der Konfiguration vielleicht noch hinterlegen WIE das Objekt erzeugt werden soll (Direkt, DIService, getAndInitServiceObject), damit wäre alles abgedeckt.
Wie deckst du dann aber bei einem Service den Fall ab, dass du beispielsweise eine Instanz des UmgtManager oder GORM oder was auch immer benötigst, der aber speziell für diesen Anwendungsfall konfiguriert sein muss? Das gehtn IMHO nur, wenn du eine statische Konfiguration hast, die eindeutig die Kaskade von abhängigen Elementen beschreibt.
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: EventHandler

Beitrag von Screeze » 07.08.2011, 00:41:26

nenene cronjobs sind hier keine Lösung. Ein cms soll mit minimaler konfiguration und minimalen anforderungen laufen. Cronjobs gibts bei vielen webspaces garnicht, und der aufwand ist zu groß.
Warum auch, geht mit den events doch viel einfacher so.


Zu deinem letzten absatz:
In dem Fall kann ich den DIServiceManager verwenden, oder wenn alle Stricke reißen immernoch auf die aktuelle Methode zurückgreifen.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: EventHandler

Beitrag von dr.e. » 07.08.2011, 12:55:57

OK, nur wie bilden wir dann "Langzeit"-Events ab, die über eine Session oder einen Request hinaus Bestand benötigen um z.B. Backend-Events auszulösen? IMHO kommen wir da garnicht um eine erweiterte Architektur herum.
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: EventHandler

Beitrag von Screeze » 08.08.2011, 18:26:30

Dass hatten wir weiter vorne bereits festgestellt, dass wir eine speicherung nur über einen erweiterten eventhandler anbieten, oder ein eventhandler anhängen, der alle events abfängt und sich um die persistenz kümmert

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: EventHandler

Beitrag von dr.e. » 08.08.2011, 22:48:15

OK, ich denke nochmal drüber nach, vielleicht kann man das noch intelligenter lösen.
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: EventHandler

Beitrag von Megger » 09.08.2011, 00:09:19

Wenn man es nicht intelligenter lösen kann, dann wäre vielleicht ein Beispielcode ganz gut mit dem man die Events speichern kann (am besten auch mit entsprechender GORM Config)
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: EventHandler

Beitrag von dr.e. » 09.08.2011, 12:10:58

Soetwas in der Art - nur in Kombination mit einem Event - habe ich mir gedacht. Ich tippe mal in einer ruhigen Minute (aktuell eher selten der Fall) einen Beispiel-Code zusammen.
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: EventHandler

Beitrag von welworx » 19.08.2011, 16:28:27

Hi Christian,

darf ich mal fragen wies mit deinem Code aussieht?

Ich find die idee vom Event Handler genial und wenn das so funktioniert wie ich mir das vorstelle sollte es somit relativ einfach möglich sein verschiedene Komponenten miteinander zu koppeln. Da ich das gerne für 2 Module einsetzten würd wäre es sehr interessant wann das ganze ungefähr fertig ist (will nicht stressen ;)... reines interesse ob es sich auszahlt noch zu warten oder das irgendwie anders zu lösen.)

LG Werner

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: EventHandler

Beitrag von dr.e. » 19.08.2011, 17:22:44

Hi Werner,

ich habe schon ein wenig Zeit investiert, nur gefällt mir meine Idee noch nicht. :) Ich werde also für ein Beispiel noch ein wenig brauchen.
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: EventHandler

Beitrag von welworx » 19.08.2011, 17:59:45

das ist schön zu hören dass hier nicht stillstand herrscht :D

danke für die info und viel Kreativität wünsch ich.

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: EventHandler

Beitrag von welworx » 29.08.2011, 17:44:55

Da ich das Kategorie modul gerne fertig stellen würde habe ich mir mal ein paar gedanken dazu gemacht wie ich das mit dem EventHandler umsetzten könnte. Nur leider komm ich irgendwie nicht weiter.

Anwendungsbeispiel:

Im Kategoriemodul feuere ich das event löschen einer kategorie. Daraufhin soll von allen Modulen die das Event verwenden entsprechende dinge getan werden.

Die Methoden auf beiden Seiten zu schreiben ist nicht das Problem, nur wie kann ich die miteinander verknüpfen?
Mal angenommen ich bin in der Administration der Kategorien und lösche dort eine. Wie kann ich das dann anstellen, dass dann alle Beiträge aus verschiedenen Modulen die möglicherweise in der Kategorie liegen gelöscht werden, ohne dass ich weiß welche Module das sind?

Ich hoffe es ist irgendwie verständlich was ich meine.

Realisiert man das am besten mit einem eventhandler der ein config file einliest welches die namespaces und funktionsnamen der verwendeten module beinhaltet und denen dann entsprechend etwas (zb kategorie objekt oder id) übergibt?

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: EventHandler

Beitrag von welworx » 02.09.2011, 18:22:45

push push ;)

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: EventHandler

Beitrag von welworx » 03.09.2011, 00:46:48

hab grad das gefunden und dachte mir vlt ist es für euch nützlich :)

http://www.devshed.com/c/a/PHP/Simulati ... h-PHP-5/1/

http://www.administrator.de/article/det ... ?nr=146483

https://cyanox.nl/trac/noxbot/browser/t ... php?rev=92


EDIT: Beim testen von Ralfs Code ist mir aufgefallen, dass im EventDispatcher relativ weit unten

Code: Alles auswählen

if (!$Event->isCancelled()) {
            if (!isset($this->Events[$Name])) {
                $this->Events[$Name] = array();
            }
            $this->Events[$Name] = $Event;
        } 
die Zeile

Code: Alles auswählen

$this->Events[$Name]= $Event; 
so heißen sollte:

Code: Alles auswählen

$this->Events[$Name][] = $Event; 
Damit man mit der Info was anfangen kann, sollte es außerdem noch

Code: Alles auswählen

public function getInfo() {
        return $this->Info;
    } 
in der Event Klasse geben.

Weites würde ich vorschlagen, dass man auch die Signatur ändert von

Code: Alles auswählen

public function &trigger($EventName, $Context = null, $Language = null, $Info = null) { 
auf

Code: Alles auswählen

public function &trigger($EventName, $Info = null,$Context = null, $Language = null) { 
da ja sicher öfter Infos mitgegeben werden als der context oder die sprache geändert.

Weiters stehe ich gerade vor dem Problem wie ich die Handler am besten Registriere. Macht man das am besten in einer FC Action, damit sie Applikationsweit zur Verfügung stehen? Ich fände es sehr praktisch, wenn man die option hätte welche mittels config datei einzutragen.

z.B.:

Code: Alles auswählen

[Eventname]
confg.1.namespace=""
confg.1.class=""
confg.1.init="" ;optional
Was haltet ihr von einer entsprechenden init funktion?

Code: Alles auswählen

 public function init($initParam) {

        if (isset($initParam['namespace'])) {
            $ConfigNamespace = $initParam['namespace'];
        } else {
            $ConfigNamespace = 'core::eventhandler';
        }
        if (isset($initParam['filename'])) {
            $ConfigFilename = $initParam['filename'];
        } else {
            $ConfigFilename = 'autoload.ini';
        }
        $Config = $this->getConfiguration($ConfigNamespace, $ConfigFilename);
        
        foreach ($Config->getSectionNames()as $EventName) {
            $EventSection = $Config->getSection($EventName);
            
            $Sectionbuffer=$EventSection->getSection('conf');
            foreach ($Sectionbuffer->getSectionNames() as $secName) {
               $sec=$Sectionbuffer->getSection($secName);
              
                $namespace = $sec->getValue('namespace');
                $class = $sec->getValue('class');
                
                try {
                    $CatchPreviousEvents = $sec->getValue('PreviousEvents');
                    if ($CatchPreviousEvents == "true") {
                        $CatchPreviousEvents = true;
                    } else {
                        $CatchPreviousEvents = false;
                    }
                } catch (Execption $e) {
                    $CatchPreviousEvents = true;
                }

                try {
                    $initParameters = $sec->getValue('init');
                } catch (Execption $e) {
                    $initParameters = null;
                }

                $Handler = $this->getAndInitServiceObject($namespace, $class, $initParameters);
                $this->addHandler($EventName, $Handler, $CatchPreviousEvents);
            }
        }
        
    } 

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: EventHandler

Beitrag von Screeze » 11.09.2011, 18:04:35

Weiters stehe ich gerade vor dem Problem wie ich die Handler am besten Registriere. Macht man das am besten in einer FC Action, damit sie Applikationsweit zur Verfügung stehen? Ich fände es sehr praktisch, wenn man die option hätte welche mittels config datei einzutragen.
Die Idee habe ich meines Wissens bereits weiter oben genannt, da ich sie auch für sehr sinnvoll halte.

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast