Eklentilerin program akışına tepki vermesini sağlayan bir uygulama düşünün.
Bunu başarmanın 2 yolunu biliyorum: kancalar ve olaylar
1. Kancalar
Ana program akışı içindeki işlevleri boşaltmak için çağrıları kullanın. Bu fonksiyonlar eklentiler tarafından geçersiz kılınabilir.
Örneğin, Drupal CMS, modüller ve temalar için mevcut olan kancaları uygular. Hook'un bir file_copy işlevinde nasıl uygulandığına bir örnek .
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;
// ...
}
Bir modül modulename_file_copy($file, $source)
, module_invoke_all
in tarafından çağrılacak bir işlevi yerine getirebilir file_copy
. Bu işlev bittikten sonra file_copy
yürütme devam edecektir.
2. Etkinlikler
Uygulamaya, eklentiler tarafından dinlenebilecek olayları gönderin. Abone olunan bir etkinliği aldıktan sonra, bir eklenti program akışını durdurur ve gerekli işlemleri gerçekleştirir.
Örneğin, bir jQuery galeri eklentisi Fotorama birkaç etkinlik uygular . Örnek olarak, olayı show
başlatan yönteminin bir parçası 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.]
};
Bir komut dosyası bu olayı dinleyebilir ve ateş ettiğinde bir şeyler yapabilir:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
SORU
Bu tür eklenti davranışını uygulamak için başka ana yollar var mı?
Olmazsa, ne zaman kanca kullanılmalı ve ne zaman etkinlik kullanılmalı? Nihai hedef göz önüne alındığında, kodun hem uygulama hem de eklenti geliştiricisinin bakış açısından daha kolay anlaşılabilir ve okunabilir hale getirilmesidir ?