diff --git a/core/lib/Drupal/Core/Messenger/BaseMessenger.php b/core/lib/Drupal/Core/Messenger/BaseMessenger.php index c71b587154..f76c295301 100644 --- a/core/lib/Drupal/Core/Messenger/BaseMessenger.php +++ b/core/lib/Drupal/Core/Messenger/BaseMessenger.php @@ -12,27 +12,6 @@ */ abstract class BaseMessenger implements MessengerInterface { - /** - * {@inheritdoc} - */ - public function addMessage($message, $type = self::TYPE_STATUS, $repeat = FALSE) { - $message = $this->convertToMarkup($message); - if ($this->shouldAddMessage($message, $type, $repeat)) { - $this->doAddMessage($message, $type); - } - return $this; - } - - /** - * Add a message in an implementation-specific way. - * - * @param string|\Drupal\Component\Render\MarkupInterface $message - * The message. - * @param string $type - * The message type. - */ - abstract protected function doAddMessage($message, $type); - /** * {@inheritdoc} */ @@ -70,23 +49,4 @@ protected function convertToMarkup($message) { return $message; } - /** - * Returns whether a message should be added or not. - * - * @param string|\Drupal\Component\Render\MarkupInterface $message - * The message. - * @param string $type - * The type. - * @param bool $repeat - * Whether to repeat or not. - * - * @return bool - * TRUE if the message should be added, FALSE otherwise. - */ - protected function shouldAddMessage($message, $type, $repeat) { - // Do not use strict type checking so that equivalent string and - // MarkupInterface objects are detected. - return $repeat || !in_array($message, $this->messagesByType($type)); - } - } diff --git a/core/lib/Drupal/Core/Messenger/ChainedMessenger.php b/core/lib/Drupal/Core/Messenger/ChainedMessenger.php index 1356dfde26..b056a2ba7d 100644 --- a/core/lib/Drupal/Core/Messenger/ChainedMessenger.php +++ b/core/lib/Drupal/Core/Messenger/ChainedMessenger.php @@ -123,7 +123,7 @@ protected function getMessenger() { * @param \Drupal\Core\Messenger\MessengerInterface $to * The messenger to merge to. */ - protected function mergeMessages(MessengerInterface $from, MessengerInterface $to) { + public function mergeMessages(MessengerInterface $from, MessengerInterface $to) { foreach ($from->all() as $type => $messages) { foreach ($messages as $message) { $to->addMessage($message, $type); diff --git a/core/lib/Drupal/Core/Messenger/MemoryMessenger.php b/core/lib/Drupal/Core/Messenger/MemoryMessenger.php index 056b0e8a3d..494a23a8e5 100644 --- a/core/lib/Drupal/Core/Messenger/MemoryMessenger.php +++ b/core/lib/Drupal/Core/Messenger/MemoryMessenger.php @@ -16,13 +16,24 @@ class MemoryMessenger extends BaseMessenger { * * @var array */ - private $messages = []; + protected $messages = [ + MessengerInterface::TYPE_ERROR => [], + MessengerInterface::TYPE_STATUS => [], + MessengerInterface::TYPE_WARNING => [], + ]; /** * {@inheritdoc} */ - protected function doAddMessage($message, $type) { - $this->messages[$type][] = $message; + public function addMessage($message, $type = self::TYPE_STATUS, $repeat = FALSE) { + $message = $this->convertToMarkup($message); + // Do not use strict type checking so that equivalent string and + // MarkupInterface objects are detected. + if ($repeat || !in_array($message, $this->messages[$type])) { + $this->messages[$type][] = $message; + } + + return $this; } /** diff --git a/core/lib/Drupal/Core/Messenger/Messenger.php b/core/lib/Drupal/Core/Messenger/Messenger.php index 2859070479..a846defd01 100644 --- a/core/lib/Drupal/Core/Messenger/Messenger.php +++ b/core/lib/Drupal/Core/Messenger/Messenger.php @@ -43,7 +43,12 @@ public function __construct(FlashBagInterface $flash_bag, KillSwitch $killSwitch * {@inheritdoc} */ public function addMessage($message, $type = self::TYPE_STATUS, $repeat = FALSE) { - parent::addMessage($message, $type, $repeat); + $message = $this->convertToMarkup($message); + // Do not use strict type checking so that equivalent string and + // MarkupInterface objects are detected. + if ($repeat || !in_array($message, $this->flashBag->peek($type))) { + $this->flashBag->add($type, $message); + } // Mark this page as being uncacheable. $this->killSwitch->trigger(); @@ -51,13 +56,6 @@ public function addMessage($message, $type = self::TYPE_STATUS, $repeat = FALSE) return $this; } - /** - * {@inheritdoc} - */ - protected function doAddMessage($message, $type) { - $this->flashBag->add($type, $message); - } - /** * {@inheritdoc} */ diff --git a/core/tests/Drupal/Tests/Core/Messenger/ChainedMessengerTest.php b/core/tests/Drupal/Tests/Core/Messenger/ChainedMessengerTest.php new file mode 100644 index 0000000000..d79e50ae74 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Messenger/ChainedMessengerTest.php @@ -0,0 +1,41 @@ +addWarning("Foo"); + $messengerFrom->addStatus("Bar"); + $messengerFrom->addError("Fiz"); + + $messengerTo = new MemoryMessenger(); + $messengerTo->addWarning("Platypus"); + + $chainedMessenger = new ChainedMessenger(); + $chainedMessenger->mergeMessages($messengerFrom, $messengerTo); + + $messages = $messengerTo->all(); + + $this->assertContains("Platypus", $messages[MessengerInterface::TYPE_WARNING]); + $this->assertContains("Foo", $messages[MessengerInterface::TYPE_WARNING]); + $this->assertContains("Bar", $messages[MessengerInterface::TYPE_STATUS]); + $this->assertContains("Fiz", $messages[MessengerInterface::TYPE_ERROR]); + + } + +}