Skip to main content

My thoughts on the Action pattern

The Action pattern is a relatively new design pattern that's become popular in the PHP community, particularly with Laravel Developers.

The pattern is a simplified version of the Command pattern, with no separate Handler class. The Action class is responsible for the handling and execution logic.

In most cases, an Action class only has a single public method called execute() or handle(), or uses PHP's __invoke() magic method.

This is a different approach from a Service class that has multiple methods to perform different tasks.

Here's a simplified version of the code of an Action from my website:

<?php

readonly final class AddRandomCtaToDailyEmail {

  public function __construct(private EntityTypeManagerInterface $entityTypeManager) {
  }

  public function __invoke(DailyEmail $email): void {
    // Checks a call to action isn't already added.
    // If not, a random one is selected and added.
  }

}

Note the DailyEmail class is a bundle class I've created that extends the regular Node class.

Different to a service, the class name describes the action being performed - usually starting with a verb followed by a noun to describe the action being taken and the object it's being taken on.

It's a simple pattern that doesn't require additional packages or libraries, and it's easy to implement in different frameworks and other languages.

Whether you call this an Action, Command or something else, I like that it encourages writing more structured code that's easy to read and test.

Was this interesting?

Subscribe to my daily newsletter for software professionals on software development and delivery, Drupal, DevOps, community, and open-source.

About me

Picture of Oliver

I'm a certified Drupal Triple Expert and former Drupal Association staff member with 18 years of experience, a Drupal core contributor, public speaker, live streamer, and host of the Beyond Blocks podcast.