uuid: - value: 15089c84-d265-4024-981e-e3c1ca354659 langcode: - value: en type: - target_id: daily_email target_type: node_type target_uuid: 8bde1f2f-eef9-4f2d-ae9c-96921f8193d7 revision_timestamp: - value: '2025-06-23T21:19:48+00:00' revision_uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 revision_log: { } status: - value: true uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 title: - value: 'My thoughts on the Action pattern' created: - value: '2025-06-20T20:26:30+00:00' changed: - value: '2025-06-23T21:19:48+00:00' promote: - value: false sticky: - value: false default_langcode: - value: true revision_translation_affected: - value: true path: - alias: /daily/2025/06/20/my-thoughts-action-pattern langcode: en body: - value: |- 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 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.

summary: '' field_daily_email_cta: - target_type: node target_uuid: 3074e1e9-c691-4f73-a71c-cfe5920f884e