Логика наблюдателя без ООП? - PullRequest
2 голосов
/ 28 июля 2010

Я думал о реализации логики, похожей на шаблон наблюдателя на моем веб-сайте, для реализации хуков.

Я ищу что-то похожее на этот Лучший способ разрешить плагины для приложения PHP

Однако код там слишком ограничен, так как я не могу прикрепить несколько хуков к одному и тому же слушателю.

Я не знаю, как усилить этот код, чтобы он мог прослушивать несколько действийна одном мероприятии.

Спасибо

Ответы [ 3 ]

3 голосов
/ 28 июля 2010

Вы можете сделать так, как предлагает ircmaxell: добавить хуки.Но ясно, что информации, которую он дал, было недостаточно для вас.

Если вам нравится учиться на собственном примере, вы можете взглянуть на CMS Drupal, который не является ООП, но использует шаблон наблюдателя, называемый hooks повсюду, чтобы обеспечить модульную конструкцию.

Хук работает следующим образом:

  • кусок php ищет существование специально названной функции.
  • Если это существует, вызвать его и использовать его вывод (или ничего не делать с ним)

Например:

  • Непосредственно перед сохранением статьив Drupal система article вызывает hook_insert
  • Каждый модуль, имеющий функцию с именем ModuleName_insert, будет видеть, что эта функция вызывается.Пример: pirate.module может иметь функцию pirate_insert ().Система article делает обход по всем модулям и проверяет, существует ли ModuleName_insert.Он пройдет мимо пиратского модуля и найдет pirate_insert ().Затем он вызовет эту функцию (и передаст некоторые аргументы).Таким образом, позволяя модулю pirate.module изменять статью непосредственно перед диссертацией (или запускать некоторые действия, такие как превращение основного текста в пиратскую речь).

Волшебство происходит в так называемых user_callbacks, Пример :

$hook = 'insert'
foreach (module_implements($hook) as $module) {
  $function = $module .'_'. $hook;
  $result = call_user_func_array($function, $args);
}

И функция module_implements может выглядеть примерно так:

$list = module_list(FALSE, TRUE, $sort); //looks for files that are considered "modules" or "addons".
foreach ($list as $module) {
  if (function_exists($module.'_'.$hook)) { //see if the module has the hook 'registered'
    $implementations[$hook][] = $module; //if so: add it to a list with functions to be called.
  }
}
1 голос
/ 28 июля 2010

Просто добавьте хук '*' и измените функцию hook(), чтобы вызывать все хуки как в названном событии, так и в событии *.

Затем просто выполните:

add_listener('*', 'mycallback');
0 голосов
/ 28 июля 2010

Взгляните на Spl_Observer .

Вы сказали, что не хотите ООП, но вы можете легко внедрить оболочку не-ООП вокруг этого.

...