web-dev-qa-db-ja.com

フックはどのように実装されていますか?

フックはそれ自体で何かなのか、それとも実際には内部でイベントとして実装されているのか?

2
Dan

フックは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();
}
2
kiamlaluno

これらはイベントではなく(symfonyを念頭に置いていると思います)、EntityStoreBaseでは次のように呼び出されます。

// Call hook_TYPE_load().
foreach ($this->moduleHandler()->getImplementations($this->entityTypeId . '_load') as $module) {
  $function = $module . '_' . $this->entityTypeId . '_load';
  $function($entities);
}
1
Rainer Feike

簡単に言うと、フックシステムは、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です。

関連する問題とリンク:

1
Cesar Moore