Der Agavi Filter VersuchPlaying with Agavi Filters

Generelles zu Filtern

In der kleinen AsciiArt unten kann man erkennen wie Filter funktionieren. Von links kommt das Request an die Applikation, dieses wird vom Dispatcher bearbeitet, der das Request und seine Daten durch die Globalen Filter schickt, diese leiten es dann an die entsprechende Action weiter, welche wiederum das ganz durch ihre eigenen Filter schickt. Jetzt wird erst das Output generiert und die Filter werden danach in umgekehrter Reihenfolge wieder durchlaufen.

Agavi's Filters are like an Onion
Agavi's Filter sind wie eine Zwiebel

Bei allen Filtern ist es so, dass die Auflistung die Reihenfolge der Ausführung bestimmt. Weiter unten ein kleines Beispiel dazu.

Globale Filter

Was sind globale Filter? – Globale Filter gelten für das Request an die Applikation. Als Beispiel kann hier der FormPopulationFiler dienen. Dieser Filter ist in der Lage eine HTML mit Werten zu füllen, was aber erst gemacht werden kann, nachdem das ganze Request durchgelaufen ist und das Output generiert worden ist. Somit ist es möglich in dem Request weitere ActionContainer zu kreieren und weiter Actions auszuführen.

Die Konfiguration der Globalen Filter findet in der global_filter.xml im Konfigurationsverzeichnis der Applikation statt. Hierbei bestimmt die Reihenfolge in welcher sie in der Datei aufgelistet werden in welcher Reihenfolge sie ausgeführt werden.

<filter name="FirstFilter"/>
<filter name="SecondFilter"/>

Hier würde der Filter mit dem Namen FirstFilter zuerst, danach dann der SecondFilter ausgeführt. Die Globalen Filter werden vom Controller geladen und auf gerufen. Hierbei gilt, dass der Controller explizit den Filter AgaviDispatchFilter registriert und ihn dann gleich danach aufruft. In diesem wird das Response gesetzt, aus dem was noch kommt.

Action Filter

Action Filter sind, wie der Name auch schon sagt, für die Action gedacht. Die Grafik oben verdeutlicht dieses sehr gut. Eine Action generiert uns ja in der passenden View das Output, welches vor der Ausgabe dann noch mit dem FormPopulationFilter bearbeitet wird.

Bei den Action Filtern gibt es eine Besonderheit. Zum einen gibt es die Action Filter, die für jede Action aufgerufen werden und Spezial Action Filter die nur für eine bestimmt Action aufgerufen werden. Die Spezialfilter werden im app/Modulverzeichnis/config/action_filters.xml spezifiziert. Die Filter die für alle Actions gelten sollen werden in app/config/action_filters.xml spezifiziert.
Zur der Reihenfolge der Ausführung ist zu sagen, dass erst die generellen und dann die speziellen.

Noch etwas sehr wichtiges, dass man bei dem entwerfen eines Action Filters nicht vergessen darf, ist das jeder Slot, jede ForwardAction ihre eigene FilterChain hat, welche die Filter nochmal durchläuft. Deswegen gibt es zwei Verschiedene Methoden in der Klasse. Die eine, executeOnce, wird immer für die „main“ Action auf gerufen, die andere execute wird dann in den restlichen FilterChains auf gerufen. Sollte man aber wollen, dass der Filter beim ersten bis zum letzten Aufruf immer gleich aufgerufen wird, bedient sich die Klasse AgaviFilter dem Trick, dass executeOnce einfach execute aufruft. ExecuteOnce muss als explizier überschrieben werden.

Aufbau eines Filters

Filter sollten immer die Klasse AgaviFilter erweitern. Dort sind schon einmal die grundlegenden Funktionen definiert wie die oben beschriebene executeOnce Methode.

In dem nachfolgenden Beispiel implementieren wir die Klasse FooBarFilter. Diese kann entweder wie im Beispiel ein Klasse sein die sowohl Global als aus Action Filter ist oder nur eines von beiden. (Hier ist es zu Demonstrationszwecken so gewählt)

<?PHP
class FooBarFilter extends AgaviFilter implements AgaviIActionFilter, AgaviIGlobalFilter {

public function executeOnce(AgaviFilterChain $filterChain, AgaviExecutionContainer $container)
{
    /* Stuff to be done before the Rest of filters and Output generation is executed */

    /* Now we continue with the other filters. THIS MUST BE DONE!!! */
    $filterChain->execute($container);

    /* now to the Stuff which needs to be done afterwards. ie. Output transformation etc. */
}
}
?>

Das Beispiel oben hat zu dem nur die Methode executeOnce, was also heißt das der Filter pro Kontext nur einmal ausgeführt würde.

Weiter Infos zu und um Agavi gibt es auf http://www.agavi.org. Auch zu empfehlen ist der Agavi FAQ in dem einige interessante Themen rund um Agavi behandelt werde.

ENGLISH TRANSLATION WILL FOLLOW!

Generelles zu Filtern

In der kleinen AsciiArt unten kann man erkennen wie Filter funktionieren. Von links kommt das Request an die Applikation, dieses wird vom Dispatcher bearbeitet, der das Request und seine Daten durch die Globalen Filter schickt, diese leiten es dann an die entsprechende Action weiter, welche wiederum das ganz durch ihre eigenen Filter schickt. Jetzt wird erst das Output generiert und die Filter werden danach in umgekehrter Reihenfolge wieder durchlaufen.

Agavi's Filters are like an Onion
Agavi’s Filter sind wie eine Zwiebel

Bei allen Filtern ist es so, dass die Auflistung die Reihenfolge der Ausführung bestimmt. Weiter unten ein kleines Beispiel dazu.

Globale Filter

Was sind globale Filter? – Globale Filter gelten für das Request an die Applikation. Als Beispiel kann hier der FormPopulationFiler dienen. Dieser Filter ist in der Lage eine HTML mit Werten zu füllen, was aber erst gemacht werden kann, nachdem das ganze Request durchgelaufen ist und das Output generiert worden ist. Somit ist es möglich in dem Request weitere ActionContainer zu kreieren und weiter Actions auszuführen.

Die Konfiguration der Globalen Filter findet in der global_filter.xml im Konfigurationsverzeichnis der Applikation statt. Hierbei bestimmt die Reihenfolge in welcher sie in der Datei aufgelistet werden in welcher Reihenfolge sie ausgeführt werden.

<filter name="FirstFilter"/>
<filter name="SecondFilter"/>

Hier würde der Filter mit dem Namen FirstFilter zuerst, danach dann der SecondFilter ausgeführt. Die Globalen Filter werden vom Controller geladen und auf gerufen. Hierbei gilt, dass der Controller explizit den Filter AgaviDispatchFilterregistriert und ihn dann gleich danach aufruft. In diesem wird das Response gesetzt, aus dem was noch kommt.

Action Filter

Action Filter sind, wie der Name auch schon sagt, für die Action gedacht. Die Grafik oben verdeutlicht dieses sehr gut. EineAction generiert uns ja in der passenden View das Output, welches vor der Ausgabe dann noch mit demFormPopulationFilter bearbeitet wird.

Bei den Action Filtern gibt es eine Besonderheit. Zum einen gibt es die Action Filter, die für jede Action aufgerufen werden und Spezial Action Filter die nur für eine bestimmt Action aufgerufen werden. Die Spezialfilter werden im app/Modulverzeichnis/config/action_filters.xml spezifiziert. Die Filter die für alle Actions gelten sollen werden inapp/config/action_filters.xml spezifiziert.
Zur der Reihenfolge der Ausführung ist zu sagen, dass erst die generellen und dann die speziellen.

Noch etwas sehr wichtiges, dass man bei dem entwerfen eines Action Filters nicht vergessen darf, ist das jeder Slot, jede ForwardAction ihre eigene FilterChain hat, welche die Filter nochmal durchläuft. Deswegen gibt es zwei Verschiedene Methoden in der Klasse. Die eine, executeOnce, wird immer für die „main“ Action auf gerufen, die andere execute wird dann in den restlichen FilterChains auf gerufen. Sollte man aber wollen, dass der Filter beim ersten bis zum letzten Aufruf immer gleich aufgerufen wird, bedient sich die Klasse AgaviFilter dem Trick, dass executeOnce einfach execute aufruft. ExecuteOnce muss als explizier überschrieben werden.

Aufbau eines Filters

Filter sollten immer die Klasse AgaviFilter erweitern. Dort sind schon einmal die grundlegenden Funktionen definiert wie die oben beschriebene executeOnce Methode.

In dem nachfolgenden Beispiel implementieren wir die Klasse FooBarFilter. Diese kann entweder wie im Beispiel ein Klasse sein die sowohl Global als aus Action Filter ist oder nur eines von beiden. (Hier ist es zu Demonstrationszwecken so gewählt)

<?PHP
class FooBarFilter extends AgaviFilter implements AgaviIActionFilter, AgaviIGlobalFilter {

public function executeOnce(AgaviFilterChain $filterChain, AgaviExecutionContainer $container)
{
    /* Stuff to be done before the Rest of filters and Output generation is executed */

    /* Now we continue with the other filters. THIS MUST BE DONE!!! */
    $filterChain->execute($container);

    /* now to the Stuff which needs to be done afterwards. ie. Output transformation etc. */
}
}
?>

Das Beispiel oben hat zu dem nur die Methode executeOnce, was also heißt das der Filter pro Kontext nur einmal ausgeführt würde.

Weiter Infos zu und um Agavi gibt es auf http://www.agavi.org. Auch zu empfehlen ist der Agavi FAQ in dem einige interessante Themen rund um Agavi behandelt werde.

1 Comment

  1. Hello Benjamien,

    deine webpage ist super, ich kann dir wirklich ein Compliment machen.

    Von I T habe ich keine Ahnung, aber man merkt, dass du der richtige Mann dafuer bist.

    Congratulation and good luck,
    Alfred

Schreibe einen Kommentar