Skip to content

Creating messages

Create message entities in response to events (entity insert hooks, custom services, queue workers, and so on).

Basic example

use Drupal\message\Entity\Message;

$message = Message::create([
  'template' => 'example_create_node',
  'uid' => $account->id(),
]);
$message->set('field_node_reference', $node);
$message->save();

save() requires a valid template. If the template is missing, a MessageException is thrown.

Setting arguments

$message->setArguments([
  '@noun' => 'article',
  '@detail' => [
    'callback' => 'my_module_format_detail',
    'arguments' => [$node->id()],
  ],
]);
$message->save();

Placeholders in the template text (for example @noun) are replaced when the message is rendered. See Arguments and callbacks.

Single-use tokens at save time

If the template text contains single-use tokens such as @{message:user-name}, save() resolves them via the Token service and merges the results into the stored arguments. Those values are then fixed for later displays.

From the example module

message_example creates messages on node, comment, and user insert:

function message_example_node_insert(Node $node) {
  $message = Message::create([
    'template' => 'example_create_node',
    'uid' => $node->get('uid'),
  ]);
  $message->set('field_node_reference', $node);
  $message->set('field_published', $node->isPublished());
  $message->save();
}

Querying messages by template

$ids = Message::queryByTemplate('example_create_node');
$messages = Message::loadMultiple($ids);

Or use an entity query when you need extra conditions:

$ids = \Drupal::entityQuery('message')
  ->accessCheck(FALSE)
  ->condition('template', 'example_create_node')
  ->condition('field_node_reference.target_id', $node->id())
  ->execute();

Deleting messages

Call $message->delete() (or load multiple and delete each).
Message::deleteMultiple() is deprecated as of Message 1.2.0 and will be removed in 2.0.0.