Invokes a hook in all enabled modules that implement it.

Invokes a hook in all enabled modules that implement it.

All arguments are passed by value. Use drupal_alter() if you need to pass arguments by reference.


dwieeb’s picture

Unfortunately this function and module_invoke() do not allow passing variables by reference.

To work around this, you can do something like this:

foreach (module_implements('my_hook') as $module) {
  $function = $module . '_my_hook';
  $function($var1, $var2);

And, make sure to have the ampersand in the hook declaration:

function my_module_my_hook(&$var1, &$var2) {
  $var1 = 'do';
  $var2 = 'stuff';
dalin’s picture

If you want to pass things by reference, it's likely that you want to do
$modified_data = drupal_alter('my_type', $data);

drclaw’s picture

There is an exception to passing by reference. If the arguments for the hook are Objects, then they are passed by reference. This is default behaviour of php:

http://php.net/manual/en/language.oop5.references.php .

An example of this in action is with the feeds hook hook_feeds_after_parse()


The hook is called using module_invoke_all, but you can, for example, remove all the


and the feeds import won't do anything.

ronyclau’s picture

If you really want to avoid a hook from altering your object, you may clone the object first as described in drupal_alter.

module_invoke_all('mydata_insert', clone $data_object);

Dubs’s picture

But again, be careful here. This is not a deep clone, so any child objects in objects, arrays, etc. could be altered.

alberto56’s picture

aaronbauman’s picture


module_invoke_all('node_view', $entity, $display, $entity_view_mode, $langcode);


\Drupal::moduleHandler()->invokeAll($view_hook, array($entity, $display, $entity_view_mode, $langcode));