フックはそれ自体で何かなのか、それとも実際には内部でイベントとして実装されているのか?
フックはSymfonyのイベントではありません。これらは、PHP特定の名前の関数で、Drupalは非常に特殊なケースで呼び出されます。
たとえば、hook_cron()
は、次のコードを使用する Cron::invokeCronHandlers()
からDrupal cronタスクが実行されるときに呼び出されます。
// Iterate through the modules calling their cron handlers (if any):
foreach ($this->moduleHandler
->getImplementations('cron') as $module) {
if (!$module_previous) {
$logger
->notice('Starting execution of @module_cron().', [
'@module' => $module,
]);
}
else {
$logger
->notice('Starting execution of @module_cron(), execution of @module_previous_cron() took @time.', [
'@module' => $module,
'@module_previous' => $module_previous,
'@time' => Timer::read('cron_' . $module_previous) . 'ms',
]);
}
Timer::start('cron_' . $module);
// Do not let an exception thrown by one module disturb another.
try {
$this->moduleHandler
->invoke($module, 'cron');
} catch (\Exception $e) {
watchdog_exception('cron', $e);
}
Timer::stop('cron_' . $module);
$module_previous = $module;
}
マシン名がspam_checkerであるモジュールは、このフックを実装して、次の関数をコードに追加できます。
function spam_checker_cron() {
// Delete the nodes from the list of nodes to check after 96 hours are passed.
Drupal::database()
->delete('spam_checker_list')
->condition('timestamp', REQUEST_TIME - 3600 * 96, '<')
->execute();
}
これらはイベントではなく(symfonyを念頭に置いていると思います)、EntityStoreBaseでは次のように呼び出されます。
// Call hook_TYPE_load().
foreach ($this->moduleHandler()->getImplementations($this->entityTypeId . '_load') as $module) {
$function = $module . '_' . $this->entityTypeId . '_load';
$function($entities);
}
簡単に言うと、フックシステムは、Drupal機能を拡張できる命名規則です。
実装の中核は次のようなものです。
// $vars is an array with the basic page variables that Drupal provides.
$hook = 'preprocess_page';
for ($modules as $module) {
call_user_func_array("${module}_${hook}", $vars);
}
// Now, $vars could have new variables or a number of modifications.
// You have effectively tampered the default workflow,
// without changing the code in the Drupal Core.
ソフトウェアエンジニアリングデザインパターンとしてのフック
Drupal 4ドキュメンテーション( オブジェクト指向の視点からのプログラミング )によると、フックは抽象化と継承の手順と同等ですOOP =コンセプトとデコレータ、オブザーバ、およびコマンドデザインパターン。
この見解はよく受け入れられているようです:
他のソースは、フックはメディエーターパターンの実装であると言います。メディエーターパターン フックとイベント
オブジェクト指向プログラミングはフックではなく未来です
Drupal 8.)の新しいオブジェクト指向モデルを使用すると、フォーム、ブロック、またはコンテンツエンティティの実装がより簡単でクリーンになります。関連するフックが削除されました。
他に削除されたフックは、hook_watchdog、hook_boot、hook_init、およびhook_exitです。
関連する問題とリンク: