Verwenden von Plugins

Komponenten die Plugins verwenden, verwenden typischerweise Zend_Loader_PluginLoader um Ihre Arbeit zu tun. Diese Klasse registriert Plugins indem ein oder mehrere "Präfix Pfade" spezifiziert werden. Diese Komponente ruft anschließend die load() Methode des PluginLoader's auf, und übergibt Ihm den Kurznamen des Plugins. Der PluginLoader wird anschließend jeden Präfix Pfad abfragen um zu sehen ob eine Klasse passt die dem Kurznamen entspricht. Präfix Pfade werden also LIFO Reihenfolge (Last In, First Out) durchsucht, deshalb werden jene Präfix Pfade abgeglichen die zuletzt registriert wurden -- was es erlaubt existierende Plugins zu überladen.

Einige Beispiele werden das alles etwas aufklären.

Beispiel 1. Grundsätzliches Plugin Beispiel: Hinzufügen eines einzelnen Präfix Pfades

In diesem Beispiel nehmen wir an das einige Prüfungen geschrieben und im Verzeichnis foo/plugins/validators/ wurden, und das alle Klassen den Klassenpräfix "Foo_Validate_" teilen; diese zwei Teile von Information formen unseren "Präfix Pfad". Weiters nehmen wir an das wir zwei Prüfungen haben, einen der "Even" genannt wird (und sicherstellt das eine Zahl die geprüft wird gerade ist), und eine andere die "Dozens" genannt wird (und sicherstellt das eine Zahl ein Vielfaches von 12 ist). Die drei könnten wie folgt anschauen:

foo/
|-- plugins/
|   |-- validators/
|   |   |-- Even.php
|   |   |-- Dozens.php

Jetzt informieren wir eine Zend_Form_Element Instanz über diesen Präfix Pfad. Zend_Form_Element's addPrefixPath() Methode erwartet ein drittes Argument welches den Typ des Plugins zeigt für den der Pfad registriert wird; in diesem Fall ist es ein "validate" Plugin.

$element->addPrefixPath('Foo_Validate', 'foo/plugins/validators/', 'validate');

Jetzt können wir dem Element einfach den kurzen Namen der Prüfung angeben die wir verwenden wollen. Im folgenden Beispiel verwenden wir einen Mix aus Standardprüfungen ("NotEmpty", "Int") und eigenen Prüfungen ("Even", "Dozens").

$element->addValidator('NotEmpty')
        ->addValidator('Int')
        ->addValidator('Even')
        ->addValidator('Dozens');

Wenn das Element geprüft werden soll, ruft es die Plugin Klasse vom PluginLoader ab. Die ersten zwei Prüfungen werden zu Zend_Validate_NotEmpty und Zend_Validate_Int aufgelöst; die nächsten zwei werden zu Foo_Validate_Even und Foo_Validate_Dozens aufgelöst.


Was passiert wenn ein Plugin nicht gefunden wird?

Was passiert wenn ein Plugin angefragt wird, aber der PluginLoader nicht in der Lage ist eine zu Ihm passende Klasse zu finden? Im obigen Beispiel, zum Beispiel, wenn wir das Plugin "Bar" mit dem Element registrieren, was würde dann passieren?

Der Plugin Loader durchsucht jeden Präfix Pfad, prüft ob eine Datei gefunden wird die in diesem Pfad auf den Plugin Namen passt. Wenn die Datei nicht gefunden wird, geht er auf den nächsten Präfix Pfad weiter.

Sobald der Stack von Präfix Pfaden erschöpft ist, und keine passende Datei gefunden wurde, wirft es eine Zend_Loader_PluginLoader_Exception.

Beispiel 2. Fortgeschrittene Plugin Verwendung: Überladen existierender Plugins

Eine Stärke des PluginLoaders ist dessen Verwendung eines LIFO Stacks welche es erlaubt existierende Plugins zu überladen indem eine eigene Version lokal mit einem anderen Präfix Pfad erstellt wird, und der Präfix Pfad später im Stack registriert wird.

Nehmen wir zum Beispiel Zend_View_Helper_FormButton an (View Helfer sind eine Form von Plugins). Dieser View Helfer akzeptiert drei Argumente, ein Elementname (der auch als DOM Identifikator des Elements verwendet wird), einen Wert (der als Button Label verwendet wird), und ein optionales Array an Attributen. Der Helfer erzeugt dann das HTML Markup für ein Formular Eingabeelement.

Sagen wir, dass der Helfer stattdessen ein echtes HTML button Element erzeugen soll; dass wir nicht wollen das der Helfer einen DOM Identifikator erzeugt, sondern statt dessen den Wert für einen CSS Klassen Selektor; und das wir kein Interesse an der behandling eigener Attribute haben. Man könnte dies auf verschiedenen wegen erreichen. In beiden Fällen erstellen wir eine eigene View Helfer Klasse die das Verhalten implementiert welches wir wollen; der Unterschied liegt darin wie wir Sie benennen und aufrufen wollen.

Unser erstes Beispiel wird der Name des Elements mit einem eindeutigen Namen sein: Foo_View_Helper_CssButton welcher den Plugin Namen "CssButton" impliziert. Wärend das ein recht brauchbarer Ansatz ist, wirft es einige Probleme auf: Wenn man bereits einen Button View Helfer im eigenen Code verwendet, muss man jetzt einges umarbeiten; alternativ, wenn ein anderer Entwickler damit beginnt Code für diese Anwendung zu schreiben, mus er unbeabsichtlicher Weise den Button View Helfer verwenden statt den neuen View Helfer.

Deshalb ist es better den Plugin Namen "Button" zu verwenden was uns den Klassennamen Foo_View_Helper_Button gibt. Wir registrieren den Präfix Pfad in der View:

// Zend_View::addHelperPath() verwendet den PluginLoader; Trotzdem invertiert
// er die Argumente, da er den Standardwert "Zend_View_Helper" für den Plugin
// Präfix anbietet.
//
// Anbei nehmen wir an das die eigene Klasse im Verzeichnis
// 'foo/view/helpers/' ist.
$view->addHelperPath('foo/view/helpers', 'Foo_View_Helper');

Sobald das getan wurde, wird überall wo wir den "Button" Helfer verwenden auf die eigene Foo_View_Helper_Button Klasse verwiesen!