8.2.x module.api.php hook_install()
8.0.x module.api.php hook_install()
8.1.x module.api.php hook_install()
8.3.x module.api.php hook_install()
4.7.x install.php hook_install()
5.x install.php hook_install()
6.x install.php hook_install()
7.x system.api.php hook_install()

Perform setup tasks when the module is installed.

If the module implements hook_schema(), the database tables will be created before this hook is fired.

If the module provides a MODULE.routing.yml or alters routing information these changes will not be available when this hook is fired. If up-to-date router information is required, for example to use \Drupal\Core\Url, then (preferably) use hook_modules_installed() or rebuild the router in the hook_install() implementation.

Implementations of this hook are by convention declared in the module's .install file. The implementation can rely on the .module file being loaded. The hook will only be called when a module is installed. The module's schema version will be set to the module's greatest numbered update hook. Because of this, any time a hook_update_N() is added to the module, this function needs to be updated to reflect the current version of the database schema.

See the Schema API documentation for details on hook_schema and how database tables are defined.

Note that since this function is called from a full bootstrap, all functions (including those in modules enabled by the current page request) are available when this hook is called. Use cases could be displaying a user message, or calling a module function necessary for initial setup, etc.

Please be sure that anything added or modified in this function that can be removed during uninstall should be removed with hook_uninstall().

See also





Related topics

28 functions implement hook_install()

Note: this list is generated by pattern matching, so it may include some functions that are not actually implementations of this hook.

block_install in core/modules/block/block.install
Implements hook_install().
comment_install in core/modules/comment/comment.install
Implements hook_install().
contact_storage_test_install in core/modules/contact/tests/modules/contact_storage_test/contact_storage_test.install
Implements hook_install().
content_translation_install in core/modules/content_translation/content_translation.install
Implements hook_install().
entity_test_install in core/modules/system/tests/modules/entity_test/entity_test.install
Implements hook_install().

... See full list

4 invocations of hook_install()
drupal_check_module in core/includes/install.inc
Checks a module's requirements.
ModuleInstaller::install in core/lib/Drupal/Core/Extension/ModuleInstaller.php
Installs a given list of modules.
NormalizerTestBase::setUp in core/modules/serialization/tests/src/Kernel/NormalizerTestBase.php
RestLinkManagerTest::testRestLinkManagers in core/modules/rest/tests/src/Kernel/RestLinkManagerTest.php
Tests that type hooks work as expected.


core/lib/Drupal/Core/Extension/module.api.php, line 230
Hooks related to module and update systems.


function hook_install() {
  // Create the styles directory and ensure it's writable.
  $directory = file_default_scheme() . '://styles';
  $mode = isset($GLOBALS['install_state']['mode']) ? $GLOBALS['install_state']['mode'] : NULL;
  file_prepare_directory($directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS, $mode);


rhett.prichard’s picture

Anyone know why a namespace in hook_install breaks it?
From what I can tell, it just doesn't run.
I have not found anywhere where that is explained.