Apakah lebih baik menggunakan module_invoke_all (), atau module_invoke () dan module_implements ()?


10

Penggunaannya module_invoke_all('some_hook')mudah, tetapi apakah ini lebih baik untuk kinerja?

foreach (module_implements('some_hook') as $module) {
  $data = module_invoke($module, 'some_hook');
}

Jawaban:


11

Ada sedikit perbedaan; module_invoke_all()jalankan kode berikut:

function module_invoke_all() {
  $args = func_get_args();
  $hook = $args[0];
  unset($args[0]);
  $return = array();
  foreach (module_implements($hook) as $module) {
    $function = $module . '_' . $hook;
    if (function_exists($function)) {
      $result = call_user_func_array($function, $args);
      if (isset($result) && is_array($result)) {
        $return = array_merge_recursive($return, $result);
      }
      elseif (isset($result)) {
        $return[] = $result;
      }
    }
  }

  return $return;
}

Satu-satunya perbedaan adalah bahwa dengan module_invoke_all(), misalnya, func_get_args()dipanggil hanya sekali, sedangkan ketika menggunakan module_invoke() func_get_args()dipanggil setiap kali module_invoke()dipanggil; itu adalah perbedaan kecil, meskipun.
Ada beberapa kasus di mana module_implementing()dan module_invoke()digunakan, biasanya ketika modul perlu mengetahui modul mana yang dipanggil, seperti dalam kasus search_get_info()yang membangun array informasi tentang modul yang mengimplementasikan fungsi pencarian.

function search_get_info($all = FALSE) {
  $search_hooks = &drupal_static(__FUNCTION__);

  if (!isset($search_hooks)) {
    foreach (module_implements('search_info') as $module) {
      $search_hooks[$module] = call_user_func($module . '_search_info');
      // Use module name as the default value.
      $search_hooks[$module] += array(
        'title' => $module,
        'path' => $module,
      );
      // Include the module name itself in the array.
      $search_hooks[$module]['module'] = $module;
    }
  }

  if ($all) {
    return $search_hooks;
  }

  $active = variable_get('search_active_modules', array('node', 'user'));
  return array_intersect_key($search_hooks, array_flip($active));
}

Contoh lain adalah image_styles () , yang mendapatkan daftar semua gaya gambar yang diterapkan oleh modul, dan yang menggunakan kode berikut:

  foreach (module_implements('image_default_styles') as $module) {
    $module_styles = module_invoke($module, 'image_default_styles');
    foreach ($module_styles as $style_name => $style) {
      $style['name'] = $style_name;
      $style['module'] = $module;
      $style['storage'] = IMAGE_STORAGE_DEFAULT;
      foreach ($style['effects'] as $key => $effect) {
        $definition = image_effect_definition_load($effect['name']);
        $effect = array_merge($definition, $effect);
        $style['effects'][$key] = $effect;
      }
      $styles[$style_name] = $style;
    }
  }

Dalam kedua kasus, informasi yang diambil dimasukkan ke dalam array di mana indeks adalah nama pendek dari modul.



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.