Skip to content

Hooks

Core Hooks

All commandfiles may implement methods that are called by Drush at various times in the request cycle. To implement one, add a #[CLI\Hook(type: HookManager::ARGUMENT_VALIDATOR, target: 'pm:install')] (for example) to the top of your method. The class constants for hooks are located in HookManager.

Custom Hooks

Drush commands can define custom events that other command files can hook. You can find examples in CacheCommands and SanitizeCommands

First, the command must implement CustomEventAwareInterface and use CustomEventAwareTrait, as described in the dependency injection documentation.

Then, the command may ask the provided hook manager to return a list of handlers with a certain attribute. In the example below, the my-event label is used:

    /**
     * This command uses a custom event 'my-event' to collect data.  Note that
     * the event handlers will not be found unless the hook manager is
     * injected into this command handler object via `setHookManager()`
     * (defined in CustomEventAwareTrait).
     */
    #[CLI\Command(name: 'example:command')]  
    public function exampleCommand()
    {
        $myEventHandlers = $this->getCustomEventHandlers('my-event');
        $result = [];
        foreach ($myEventHandlers as $handler) {
            $result[] = $handler();
        }
        sort($result);
        return implode(',', $result);
    }

Other commandfiles may provide implementations via a PHP8 Attribute or an Annotation.

/**
 * #[CLI\Hook(type: HookManager::ON_EVENT, target: 'my-event')]
 */
public function hookOne()
{
    return 'one';
}
/**
 * @hook on-event my-event
 */
public function hookOne()
{
    return 'one';
}

Last update: March 12, 2024