क्या मॉड्यूल_invoke_all (), या मॉड्यूल_invoke () और मॉड्यूल_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

जब आप कोड पर एक नज़र डालते हैं, तो मॉड्यूल_इनवोक_ऑल सिर्फ यही करता है, साथ ही साथ कुछ पवित्रता की जाँच करता है। और यह आसान है। :-)


1
लिंक टूट गया है, शायद Drupal की प्राथमिकता के कारण 8. D7 यहाँ है: api.drupal.org/api/drupal/includes -module.inc/function/…
user1359

-1

यह शायद न तो उपयोग करने के लिए बेहतर है, और इसके बजाय drupal_alter () का उपयोग करें ।

मॉड्यूल_invoke_all () प्रलेखन में कहा गया है ,

सभी तर्क मूल्य द्वारा पारित किए जाते हैं। यदि आपको संदर्भ द्वारा तर्क पारित करने की आवश्यकता है, तो drupal_alter () का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.