How to create module in Drupal?

Drupal module means an extension that can be used to extend the core functionality. There are a lot of contributed modules available in drupal.org. Most of the time, our requirements are satisfied with those contributed modules. But sometimes we have to create our own custom modules.

Here I am explaining how to create a custom module. This blog is based on the Drupal 9 version.

There are three ways to create modules.

 

1. Manually

If you are new in drupal development please use this method to create modules.

  • Create a folder under your-project-folder/web/modules/custom directory Eg: refactor
  • Add your-project-folder/web/modules/custom/refactor/refactor.info.yml file
  • Add necessary informations on refactor.info.yml file

    name: Refactor

    type: module

    description: 'Providing custom project handlers.'

    package: Custom

    core_version_requirement: ^8 || ^9

name key provides text name of module which is displayed in admin module listing page.

description is the brief of the module.

type key value should be ‘module’

core_version_requirement key specifies that this module is compatible with versions mentioned here. The Core_version_requirement requirement only works with 8.7.7 or greater. If your moule need to work with lower version then you have to use core key ie, core: 8.x

package key can be used to group the modules in admin module module listing page. This is not a required key. But it would be nice to place your module under a package.

On the above name, type, core_version_requirement or core are required key. The others are optional.

List of other key can be used in .info.yml file

Dependencies  -: This key is used to add the list of dependent modules.

Eg: dependencies:

       - drupal:file

test_dependencies  -: Same like Dependencies, but it is used to add list of test dependency modules.

configure: refactor.settings  This is used to specify module configuration file. You can add refactor.settings.yml file under refactor/config directory. It is not required to mention configure key in .info.yml file

php: 7.4 This key is used to specify the minimum PHP version required to run this module.

hidden: true  If you want to hide the module from admin module listing

required: true If you don't want to remove the  module once installed.

There are some other keys which will be added automatically when we submit this module to Drupal.org.

.info.yml file the only file required to install the module. But I would recommend to add .module ie your-project-folder/web/modules/custom/refactor/refactor.module file to keep it standard.

 

2. Using Drush

Drush is a command line tool for drupal development.You can install drush via composer require --dev drush/drush

Run the below code after installing drush

vendor/bin/drush generate module

This will ask a lot of options like below.        

Welcome to module generator!

Module name [Web]:

refactor

Module machine name [test]:

refactor

Module description [Provides additional functionality for the site.]:

Providing custom project handlers.

Package [Custom]:

custom

Dependencies (comma separated):

Would you like to create module file? [No]:

yes

Would you like to create install file? [No]:

Would you like to create libraries.yml file? [No]:

Would you like to create permissions.yml file? [No]:

Would you like to create event subscriber? [No]:

Would you like to create block plugin? [No]:

Would you like to create a controller? [No]:

Would you like to create settings form? [No]:

That's it. Drush will create a module under the web/custom folder automatically.

 

3. Using Drupal console

Drupal console is another command line tool for drupal which is inspired by symfony console.

You can install Drupal console via

composer require drupal/console:~1.0 \
--prefer-dist \
--optimize-autoloader \
--sort-packages \
--no-update

 

Run the below code after installing Drupal console

vendor/bin/drupal generate:module

This will ask the following options

// Welcome to the Drupal module generator

Enter the new module name:

refactor

Enter the module machine name [refactor]:

refactor

Enter the module Path [modules/custom]:

custom

Enter module description [My Awesome Module]:

Providing custom project handlers.

Enter package name [Custom]:

custom

Enter Drupal Core version [8.x]:

8.x

Do you want to generate a .module file? (yes/no) [yes]:

yes

Define module as feature (yes/no) [no]:

Do you want to add a composer.json file to your module? (yes/no) [yes]:

Would you like to add module dependencies? (yes/no) [no]:

Do you want to generate a unit test class? (yes/no) [yes]:

Do you want to generate a themeable template? (yes/no) [yes]:

Do you want proceed with the operation? (yes/no) [yes]:

That's it. Drush will create a module under the web/custom folder automatically.

This is just a basic example of how to create a module. You can add functionalities based on your requirements.