Механизм работы хуков

Russian

Как и любой веб-фреймворк, Drupal берет на себя часть об-
работки HTTP-запроса, вызывая написанные в модулях функции
на определенных этапах. Drupal знает, когда нужно вызвать ту
или иную функцию некоторого модуля благодаря механизму хуков
(hooks). Хук – это спецификация API-функции Drupal с фиксиро-
ванным именем, сигнатурой и семантикой. Реализация хука – это
PHP-функция в некотором модуле Drupal, соответствующая спе-
цификации.
По смыслу хук аналогичен интерфейсу в ООП, а реализация
хука – реализации интерфейса в некотором классе. Однако возмож-
ности ООП PHP не используются для осуществления работы хуков.
Реализация механизма хуков в Drupal построена на возможности
PHP вызывать функцию по её имени и соглашении об именовании
функций в модулях. В PHP можно сделать так:

  1. // Собираем имя нашей функции конкатенацией строк.
  2. $function = ’modulename’ . ’_’ . ’hookname’;
  3. // Проверяем, есть ли функция с полученным именем.
  4. if (function_exists($function)) {
  5. // Вызываем функцию по имени.
  6. $result = $function($params);>
  7. }

Только в Drupal это делается с помощью функции PHP
call_user_func_array().
Реализовать некоторый хук hookname в модуле modulename –
значит создать PHP-функцию в файле modulename.module с име-
нем modulename_hookname(), формальными параметрами и семан-
тикой в соответствии со спецификацией этого хука. Например,
функция user_help() в модуле user.module является реализацией ху-
ка hook_help() и должна возвращать справочную информацию для
пользователей модуля user. Спецификации стандартных хуков нуж-
но смотреть на api.drupal.org и со временем выучить.

Ядро Drupal и модули вызывают хуки друг друга с помощью
функций module_invoke() и module_invoke_all().
Последняя функция вызывает последовательно реализации некоторого хука во всех
активных модулях в порядке возрастания веса модулей в таблице
system.
Чтобы Drupal определил, какие модули реализуют какие хуки,
он должен при каждой загрузке страницы включить как минимум
все .module файлы активных модулей. Поэтому в больших моду-
лях в .module файлах оставляют только реализации хуков, а про-
чие функции выносят в другие файлы для ускорения загрузки (бут-
страппинга
).

В качестве примера рассмотрим вызов hook_cron и его реали-
зацию в стандартном модуле dblog.

  1. // Для всех модулей, реализующих хук cron.
  2. foreach (module_implements(’cron’) as $module) {
  3. // Не позволяем исключениям в модулях
  4. // прервать выполнение в других модулях.
  5. try {
  6. // Вызываем реализацию хука cron в модуле.
  7. module_invoke($module, ’cron’);
  8. }
  9. catch (Exception $e) {
  10. watchdog_exception(’cron’, $e);
  11. }
  12. }

Реализация хука cron в модуле dblog занимается чисткой таб-
лицы логов:

  1. function dblog_cron() {
  2. // Лимит строк.
  3. $row_limit = variable_get(’dblog_row_limit’, 1000);
  4. if ($row_limit > 0) {
  5. // Достаем номер последней записи.
  6. $min_row = db_select(’watchdog’, ’w’)
  7. ->fields(’w’, array(’wid’))
  8. ->orderBy(’wid’, ’DESC’)
  9. ->range($row_limit - 1, 1)
  10. ->execute()->fetchField();
  11. }
  12. // Удаляем все записи
  13. // с номерами меньше последней.
  14. if ($min_row) {
  15. db_delete(’watchdog’)
  16. ->condition(’wid’, $min_row,<)
  17. ->execute();
  18. }
  19. }

Нехитрые правила именования функций и построенный на них
механизм хуков позволяет реализовать некоторые полезные шабло-
ны проектирования (паттерны),
являющиеся основой архитектуры,
мощных возможностей, гибкости и отличий Drupal . Модули име-
ют возможность влиять на работу друг друга. Реализацией соответ-
ствующих хуков в своём модуле можно изменить работу других
модулей или ядра Drupal, не внося изменения в их код. Обратная
сторона – сложность отладки взаимодействия модулей в трудных
случаях

Категория: 
The code has been tested and works
Мультитег: 

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Target Image