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