Drush 11 generate command examples
Speed up module & theme development with these handy Drush commands
What is Drush?
Drush (combo of Drupal + Shell) is a command line tool used to control your Drupal installation(s) with. With Drush you can easily running database updates, clear caches, log in, export/import configurations and more all by typing a few commands into your Terminal.
If you don't already use Drush well in short once you try it you'll probably wonder how you ever lived without it. In addition, if your building Drupal projects with Composer (which you really should) it's very simple to install Drush both on your local machine and on your live servers.
Installing Drush with Composer
You can install Drush both global (your whole machine) and at project level (ie. within your Drupal site directory) as a vendor package.
Global used to be the way to go but now with Drupal embracing Composer it's very easy to install Drush with Composer and use it as a vendor package specific to the Drupal project.
This has a big advantage over a global install: Composer will find the right Drush version for your version of Drupal so you don't have to, if you install Drush globally you might end up with 1 Drupal site needing say Drush 9 and 1 Drupal needing Drush 11 so for me installing Drush with Composer is the only sustainable option. It also means you'll have Drush available at project level on your servers too once you deploy your Drupal site.
To install Drush with Composer running:
composer require drush/drush (prefix with
ddev if you're running DDEV)
composer.json file and you should now see if new line in
Now to run Drush at project level, open Terminal/Command line and go to the directory when your
composer.json file is and you can run (use this locally or on live servers):
If you're working locally and use DDEV you can just run:
ddev drush DRUSH-COMMAND
drush status command to ensure everything is working and you should see something like the following output:
Drupal version : 10.0.7 Site URI : https://SITE.ddev.site DB driver : mysql DB hostname : db DB port : 3306 DB username : db DB name : db Database : Connected Drupal bootstrap : Successful Default theme : olivero Admin theme : claro PHP binary : /PHP-BINARY-PATH/php8.1 PHP config : /PHP-PATH/php/8.1/cli/php.ini PHP OS : Linux PHP version : 8.1.8 Drush script : /PROJECT-PATH/vendor/bin/drush Drush version : 11.5.1 Drush temp : /tmp Drush configs : /PROJECT-PATH/vendor/drush/drush/drush.yml Install profile : standard Drupal root : /PROJECT-PATH/. Site path : sites/default Files, Public : sites/default/files Files, Temp : /tmp
Pretty easy right?!
Drush 11 generate commands
Drush generate commands were added to Drush 11 and I believe similar functionality used to be available in Drupal Console called scaffolding, with Drupal Console seemingly now abandoned Drush took over the reins and added it's own set of really awesome generate commands.
The basic command is:
drush generate THING-TO-GENERATE
Drush 11 generate command examples
I've picked out 4 examples of Drush generate commands that I regularly use. I'll use the DDEV command version since all these commands are for while you're site is in active development which should only be done locally.
I use this every time I need to build a new custom module on projects, it creates the module directory & files you select based on the options all named for the module and ready to start coding with.
For this example we'll make a basic new module called "
drush_generate_demo" by running:
ddev drush generate module
First thing with all commands that Drush will ask for is the module name ie. "Drush Generate Demo" then the machine name which it will autosuggest for you based on the module name. Then you can add a description and package.
Next you'll be asked about dependencies you module has in order to function. For the sake of this example type: drupal:search, drupal:shortcut and add the Core Search & Shortcut modules as requirements for our module.
You'll then get a selection of questions based on what files you want to add to your module, this is dependant on the module you're making, you can always come back and add new files with other generate commands, I've add a module, install & libraries.yml file for this example.
Welcome to module generator! –––––––––––––––––––––––––––––– Module name [Html]: ➤ Drush Generate Demo Module machine name [drush_generate_demo]: ➤ Module description [Provides additional functionality for the site.]: ➤ Package [Custom]: ➤ Dependencies (comma separated): ➤ drupal:search,drupal:shortcut Would you like to create module file? [No]: ➤ Yes Would you like to create install file? [No]: ➤ Yes Would you like to create libraries.yml file? [No]: ➤ Yes 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]: ➤ The following directories and files have been created or updated: ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– • /PROJECT-ROOT/modules/custom/drush_generate_demo/drush_generate_demo.info.yml • /PROJECT-ROOT/modules/custom/drush_generate_demo/drush_generate_demo.install • /PROJECT-ROOT/modules/custom/drush_generate_demo/drush_generate_demo.libraries.yml • /PROJECT-ROOT/modules/custom/drush_generate_demo/drush_generate_demo.module
And there you see Drush has created a bunch of new module files automatically for us, nice!!
Next we want to add a HOOK_form_alter hook to our module, it's as simple as:
ddev drush generate hook
For "Module machine name" if you've installed the "drush_generate_demo" module when you start to type "drush_generate_demo" and Drush will autocomplete and find the module name.
Now for "Hook name" start writing the name of the hook ie. form_alter and again Drush will autocomplete. Resulting in:
Welcome to hook generator! –––––––––––––––––––––––––––– Module machine name [html]: ➤ drush_generate_demo Hook name: ➤ form_alter The following directories and files have been created or updated: ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– • /PROJECT-ROOT/modules/custom/drush_generate_demo/drush_generate_demo.module
Open up drush_generate_demo.module and you'll see the new form_alter hook commented and filled with example code:
Ok so let's pretend we've started to build out our module with lots of repeated custom code and it's starting to get messy, in cases like this I like to create a custom "helper" service which I can call on and store repetitive functions in to use throughout my module code.
ddev drush generate service:custom
And answer the following:
Welcome to custom-service generator! –––––––––––––––––––––––––––––––––––––– Module machine name [html]: ➤ drush_generate_demo Service name [drush_generate_demo.example]: ➤ drush_generate_demo.helpers Class [Helpers]: ➤ DrushGenerateDemoHelpers Would you like to inject dependencies? [Yes]: ➤ Type the service name or use arrows up/down. Press enter to continue: ➤ entity_type.manager Type the service name or use arrows up/down. Press enter to continue: ➤ The following directories and files have been created or updated: ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– • /PROJECT-ROOT/modules/custom/drush_generate_demo/drush_generate_demo.services.yml • /PROJECT-ROOT/modules/custom/drush_generate_demo/src/DrushGenerateDemoHelpers.php
entity_type.manager as an example so we it's available to lookup content using the
You can now call the service like so:
$helpers = \Drupal::service('drush_generate_demo.helpers'); $helpers->someFunctionInCustomService();
Or you can inject it which we'll let Drush do for us in the next example.
Next let's add a page using a controller to our module by running:
ddev drush generate controller
Use the same Module machine name as before and accept the default Class name then here's the bit I really like, you can tell Drush which service dependencies to inject into your controller to make use of.
For our example let's inject our custom service from above along with
@logger.factory so we could write logs to the database &
@config.factory so we can read configurations stored in Drupal. Say yes to "Would you like to inject dependencies? [No]:" and then in "Type the service name (without the @ sign) or use arrows up/down. Press enter to continue:" start typing the name of the service you want to add or you can scroll up and down with the arrow keys.
Next select "Yes" for "Would you like to create a route for this controller? [Yes]:" and use the defaults for the remaining questions:
Welcome to controller generator! –––––––––––––––––––––––––––––––––– Module machine name [html]: ➤ drush_generate_demo Class [DrushGenerateDemoController]: ➤ Would you like to inject dependencies? [No]: ➤ Yes Type the service name or use arrows up/down. Press enter to continue: ➤ logger.factory Type the service name or use arrows up/down. Press enter to continue: ➤ config.factory Type the service name or use arrows up/down. Press enter to continue: ➤ drush_generate_demo.helpers Would you like to create a route for this controller? [Yes]: ➤ Route name [drush_generate_demo.example]: ➤ Route path [/drush-generate-demo/example]: ➤ Route title [Example]: ➤ Route permission [access content]: ➤ The following directories and files have been created or updated: ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– • /PROJECT-ROOT/modules/custom/drush_generate_demo/drush_generate_demo.routing.yml • /PROJECT-ROOT/modules/custom/drush_generate_demo/src/Controller/DrushGenerateDemoController.php
There you go again a new page controller available at
/drush-generate-demo/example once you clear your cache and you can now edit the
/src/Controller/DrushGenerateDemoController.php file to build your page with the custom
drush_generate_demo.helpers service and
config.factory services injected and available to use.
TIP: I personally find it hard to know exactly what services are available in Drupal so if you install the Devel module and then run
ddev drush devel:services which will should you a list of all core & contrib services available on your project.
And there you go, hopefully I've been able to illustrate just how useful Drush generate can be and you now want to start using these commands your own development!