ควรใช้ module_invoke_all () หรือ module_invoke () และ module_implements () ดีกว่าไหม?


10

การใช้module_invoke_all('some_hook')นั้นง่าย แต่สิ่งนี้ดีกว่าสำหรับประสิทธิภาพหรือไม่

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

คำตอบ:


11

มีความแตกต่างเล็กน้อย module_invoke_all()เรียกใช้รหัสต่อไปนี้:

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;
}

ความแตกต่างเพียงอย่างเดียวคือmodule_invoke_all()ยกตัวอย่างเช่นfunc_get_args()ถูกเรียกใช้เพียงครั้งเดียวในขณะที่เมื่อmodule_invoke() func_get_args()มีการเรียกใช้การใช้งานแต่ละครั้งmodule_invoke()จะถูกเรียก นั่นคือความแตกต่างเล็กน้อย
มีบางกรณีที่มีmodule_implementing()และmodule_invoke()มีการใช้ตามปกติเมื่อโมดูลต้องการที่จะทราบว่าโมดูลถูกเรียกเช่นในกรณีของsearch_get_info()ที่สร้างอาร์เรย์ของข้อมูลเกี่ยวกับโมดูลการใช้ฟังก์ชั่นการค้นหา

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));
}

อีกตัวอย่างหนึ่งคือimage_styles ()ซึ่งรับรายการรูปแบบรูปภาพทั้งหมดที่นำมาใช้โดยโมดูลและที่ใช้รหัสต่อไปนี้:

  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;
    }
  }

ในทั้งสองกรณีข้อมูลที่ดึงมาจะถูกใส่ในอาร์เรย์โดยที่ดัชนีนั้นเป็นชื่อย่อของโมดูล


5

เมื่อคุณดูรหัสแล้วmodule_invoke_allจะทำเช่นนั้นบวกกับการตรวจสุขภาพจิตสองสามครั้ง และเป็นเรื่องง่าย :-)


1
ลิงก์ใช้งานไม่ได้อาจเป็นเพราะการจัดลำดับความสำคัญของ Drupal 8 D7 อยู่ที่นี่: api.drupal.org/api/drupal/includes!module.inc/function/?hl=th
1359

-1

มันน่าจะดีกว่าถ้าใช้ทั้งสองอย่างและใช้drupal_alter ()แทน

ตามที่ระบุในmodule_invoke_all) เอกสาร ( ,

อาร์กิวเมนต์ทั้งหมดถูกส่งผ่านตามค่า ใช้ drupal_alter () ถ้าคุณต้องการส่งอาร์กิวเมนต์โดยอ้างอิง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.