Est-il préférable d'utiliser module_invoke_all () ou module_invoke () et module_implements ()?


10

L'utilisation module_invoke_all('some_hook')est facile, mais est-ce meilleur pour les performances?

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

Réponses:


11

Il y a peu de différence; module_invoke_all()exécute le code suivant:

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

La seule différence est qu'avec module_invoke_all(), par exemple, func_get_args()n'est invoqué qu'une seule fois, alors que lors de l'utilisation module_invoke() func_get_args()est appelée chaque fois module_invoke()est appelée; c'est une différence marginale, cependant.
Il y a quelques cas où module_implementing()et module_invoke()sont utilisés, normalement quand un module a besoin de savoir quel module est appelé, comme dans le cas search_get_info()qui construit un tableau d'informations sur les modules implémentant des fonctions de recherche.

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

Un autre exemple est image_styles () , qui obtient la liste de tous les styles d'image implémentés par les modules, et qui utilise le code suivant:

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

Dans les deux cas, les informations récupérées sont placées dans un tableau où l'index est le nom court du module.



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.