Stellen Sie sich eine App vor, mit der Plugins auf ihren Programmfluss reagieren können.
Ich kenne zwei Möglichkeiten, um dies zu erreichen: Hooks und Events
1. Haken
Verwenden Sie Aufrufe, um Funktionen im Hauptprogrammablauf zu leeren. Diese Funktionen können durch Plugins überschrieben werden.
Beispielsweise implementiert Drupal CMS Hooks, die Modulen und Themen zur Verfügung stehen. Hier ist ein Beispiel, wie Hooks in einer file_copy- Funktion implementiert werden.
function file_copy(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
// ... [File copying routine]
// Inform modules that the file has been copied.
module_invoke_all('file_copy', $file, $source);
return $file;
// ...
}
Ein Modul kann eine modulename_file_copy($file, $source)
Funktion implementieren , die vom module_invoke_all
in aufgerufen wird file_copy
. Nach Beendigung dieser Funktion file_copy
wird die Ausführung fortgesetzt.
2. Ereignisse
Lassen Sie die App Ereignisse versenden, die von den Plugins abgehört werden können. Nachdem ein abonniertes Ereignis empfangen wurde, fängt ein Plugin den Programmablauf ab und führt die erforderlichen Vorgänge aus.
Ein Fotorama-Plugin für die jQuery-Galerie implementiert beispielsweise mehrere Ereignisse . Hier ist ein Teil der show
Methode, die das fotorama:show
Ereignis auslöst.
that.show = function (options) {
// ... [show the new frame]
// [fire the event]
options.reset || triggerEvent('show', {
user: options.user,
time: time
});
// ... [do lots of other stuff with navigation bars, etc.]
};
Ein Skript kann dieses Ereignis abhören und etwas tun, wenn es ausgelöst wird:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
FRAGE
Gibt es andere gängige Methoden, um ein solches Plugin-Verhalten zu implementieren?
Wenn nicht, wann sollte man Hooks verwenden und wann sollte man Events verwenden? Ist es das ultimative Ziel, den Code sowohl aus Sicht der App als auch aus Sicht des Plugin-Entwicklers besser zu verwalten und lesbar zu machen ?