Рассмотрим приложение, которое позволяет плагинам реагировать на ход программы.
Я знаю 2 способа добиться этого: хуки и события
1. Крючки
Используйте вызовы для очистки функций внутри основного потока программы. Эти функции могут быть переопределены плагинами.
Например, Drupal CMS реализует хуки, которые доступны для модулей и тем. Вот пример того, как ловушка реализована в функции file_copy .
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;
// ...
}
Модуль может реализовать modulename_file_copy($file, $source)
функцию, которая будет вызываться функцией module_invoke_all
in file_copy
. После завершения этой функции file_copy
выполнение возобновится.
2. События
Получите от приложения события отправки, которые могут прослушиваться плагинами. После получения события, на которое он подписан, плагин будет перехватывать поток программы и выполнять необходимые операции.
Например, плагин галереи jQuery Fotorama реализует несколько событий . Например, вот часть его show
метода, который запускает fotorama:show
событие.
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.]
};
Скрипт может прослушивать это событие и что-то делать при его запуске:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
ВОПРОС
Существуют ли другие основные способы реализации такого поведения плагина?
Если нет, то когда следует использовать хуки и когда следует использовать события? Учитывая конечную цель - сделать код более понятным и читаемым как с точки зрения приложения, так и с точки зрения разработчика плагина?