diff --git a/vendor/magento/module-theme/Controller/Result/MessagePlugin.php b/vendor/magento/module-theme/Controller/Result/MessagePlugin.php index 10cba6e8690..1de5189d262 100644 --- a/vendor/magento/module-theme/Controller/Result/MessagePlugin.php +++ b/vendor/magento/module-theme/Controller/Result/MessagePlugin.php @@ -8,7 +8,7 @@ namespace Magento\Theme\Controller\Result; use Magento\Framework\App\ObjectManager; use Magento\Framework\Controller\Result\Json; use Magento\Framework\Controller\ResultInterface; -use Magento\Framework\Message\MessageInterface; +use Magento\Framework\Stdlib\Cookie\CookieSizeLimitReachedException; use Magento\Framework\Translate\Inline\ParserInterface; use Magento\Framework\Translate\InlineInterface; @@ -94,11 +94,44 @@ class MessagePlugin ResultInterface $result ) { if (!($subject instanceof Json)) { - $this->setCookie($this->getMessages()); + $newMessages = []; + foreach ($this->messageManager->getMessages(true)->getItems() as $message) { + $newMessages[] = [ + 'type' => $message->getType(), + 'text' => $this->interpretationStrategy->interpret($message), + ]; + } + if (!empty($newMessages)) { + $this->setMessages($this->getCookiesMessages(), $newMessages); + } } return $result; } + /** + * Add new messages to already existing ones. + * + * In case if there are too many messages clear old messages. + * + * @param array $oldMessages + * @param array $newMessages + * @throws CookieSizeLimitReachedException + */ + private function setMessages(array $oldMessages, array $newMessages): void + { + $messages = array_merge($oldMessages, $newMessages); + try { + $this->setCookie($messages); + } catch (CookieSizeLimitReachedException $e) { + if (empty($oldMessages)) { + throw $e; + } + + array_shift($oldMessages); + $this->setMessages($oldMessages, $newMessages); + } + } + /** * Set 'mage-messages' cookie with 'messages' array * @@ -158,24 +191,6 @@ class MessagePlugin return $text; } - /** - * Return messages array and clean message manager messages - * - * @return array - */ - protected function getMessages() - { - $messages = $this->getCookiesMessages(); - /** @var MessageInterface $message */ - foreach ($this->messageManager->getMessages(true)->getItems() as $message) { - $messages[] = [ - 'type' => $message->getType(), - 'text' => $this->interpretationStrategy->interpret($message), - ]; - } - return $messages; - } - /** * Return messages stored in cookies *