Хуки вызываются с помощью module_invoke()
и module_invoke_all()
: если вы посмотрите на код для этих двух функций, вы сможете собрать воедино, как это работает, нов основном, если я добавлю это к коду моего модуля:
// Other code
$foo = module_invoke_all('foo_bar', $var1, $var2);
// More code
Drupal будет вызывать каждую реализацию hook_foo_bar($var1, $var2)
, найденную во включенных модулях.Исходя из этого, вы должны увидеть, что единственное, что связывает определенный хук с конкретным модулем, это соглашение об именах: если я вызываю мой модуль foo
, мои функции перехвата должны начинаться с hook_foo_
.
.в том, что *.api.php
вызывается правильно, поскольку вызов модуля является просто вызовом функции, авторы модуля включают foo.api.php
просто для целей документирования, чтобы сообщить разработчикам, как реализовать ловушку.
Например, вв приведенном выше случае foo.api.php
будет включать в себя пример функции, такой как:
/**
* Doxygen comments documenting the function goes here
*/
function hook_foo_bar($var1, $var2) {
return $var1 + $var2;
}
Но в качестве разработчика модуля я мог бы реализовать hook_foo_bar()
другим способом:
function mymodule_foo_bar($var1, $var2) {
return $var1 - $var2;
}
Икогда вызывается module_invoke_all()
, Drupal создаст функцию, используя короткое имя реализующего модуля (mymodule
) и имя ловушки, переданное в module_invoke_all()
(foo_bar
), вызывая функцию mymodule_foo_bar()
, которую я только что определил.
Модуль system
в ядре немного универсален: одна задача для Drupal 8 состоит в том, чтобы убить его и делегировать его функциональность другим модулям.