[!!!][FEATURE] Refactoring of FlashMessage rendering 85/50285/22
authorSusanne Moog <susanne.moog@typo3.com>
Mon, 9 Jan 2017 22:04:19 +0000 (23:04 +0100)
committerMarkus Klein <markus.klein@typo3.org>
Wed, 11 Jan 2017 22:14:21 +0000 (23:14 +0100)
This patch reverts some changes of #73698 and adds some new things:

- Introduce context based FlashMessageRenderer
- Add special FlashMessageViewHelper for the backend
- Cleanup classes related to FlashMessages
- Deprecate some methods from the FlashMessages::class

Resolves: #78477
Related: #73698
Releases: master
Change-Id: I937d5896b0a3d45e59c9174d233410f202add997
Reviewed-on: https://review.typo3.org/50285
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
21 files changed:
typo3/sysext/core/Classes/Database/QueryView.php
typo3/sysext/core/Classes/Messaging/AbstractMessage.php
typo3/sysext/core/Classes/Messaging/FlashMessage.php
typo3/sysext/core/Classes/Messaging/FlashMessageQueue.php
typo3/sysext/core/Classes/Messaging/FlashMessageRendererResolver.php [new file with mode: 0644]
typo3/sysext/core/Classes/Messaging/FlashMessageService.php
typo3/sysext/core/Classes/Messaging/Renderer/BootstrapRenderer.php [new file with mode: 0644]
typo3/sysext/core/Classes/Messaging/Renderer/FlashMessageRendererInterface.php [new file with mode: 0644]
typo3/sysext/core/Classes/Messaging/Renderer/ListRenderer.php [new file with mode: 0644]
typo3/sysext/core/Classes/Messaging/Renderer/PlaintextRenderer.php [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Breaking-78477-RefactoringOfFlashMessageRendering.rst [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Breaking-78477-RefactoringOfFlashMessageRenderingViewHelper.rst [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Deprecation-78477-RefactoringOfFlashMessageRendering.rst [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Feature-78477-RefactoringOfFlashMessageRendering.rst [new file with mode: 0644]
typo3/sysext/core/Tests/Functional/Messaging/FlashMessageQueueTest.php
typo3/sysext/core/Tests/Unit/Messaging/FlashMessageRendererResolverTest.php [new file with mode: 0644]
typo3/sysext/core/Tests/Unit/Messaging/Renderer/BootstrapRendererTest.php [new file with mode: 0644]
typo3/sysext/core/Tests/Unit/Messaging/Renderer/ListRendererTest.php [new file with mode: 0644]
typo3/sysext/core/Tests/Unit/Messaging/Renderer/PlaintextRendererTest.php [new file with mode: 0644]
typo3/sysext/fluid/Classes/ViewHelpers/FlashMessagesViewHelper.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/FlashMessagesViewHelperTest.php

index af4c577..d3f07c8 100644 (file)
@@ -22,6 +22,7 @@ use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
+use TYPO3\CMS\Core\Messaging\FlashMessageRendererResolver;
 use TYPO3\CMS\Core\Utility\DebugUtility;
 use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -366,7 +367,9 @@ class QueryView
                 }
             }
             if (!empty($flashMessage)) {
-                $msg = $flashMessage->getMessageAsMarkup();
+                $msg = GeneralUtility::makeInstance(FlashMessageRendererResolver::class)
+                    ->resolve()
+                    ->render([$flashMessage]);
             }
         }
         if ($saveStoreArray) {
@@ -500,7 +503,9 @@ class QueryView
                         '',
                         FlashMessage::INFO
                     );
-                    $out = $flashMessage->getMessageAsMarkup();
+                    GeneralUtility::makeInstance(FlashMessageRendererResolver::class)
+                        ->resolve()
+                        ->render([$flashMessage]);
                 }
                 $cPR['header'] = 'Result';
                 $cPR['content'] = $out;
index d49e2f9..6beaeaf 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+declare(strict_types=1);
 namespace TYPO3\CMS\Core\Messaging;
 
 /*
@@ -14,6 +15,8 @@ namespace TYPO3\CMS\Core\Messaging;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Core\Utility\MathUtility;
+
 /**
  * A class used for any kind of messages.
  */
@@ -51,7 +54,7 @@ abstract class AbstractMessage
      *
      * @return string The message's title.
      */
-    public function getTitle()
+    public function getTitle() : string
     {
         return $this->title;
     }
@@ -62,9 +65,9 @@ abstract class AbstractMessage
      * @param string $title The message's title
      * @return void
      */
-    public function setTitle($title)
+    public function setTitle(string $title)
     {
-        $this->title = (string)$title;
+        $this->title = $title;
     }
 
     /**
@@ -72,7 +75,7 @@ abstract class AbstractMessage
      *
      * @return string The message.
      */
-    public function getMessage()
+    public function getMessage() : string
     {
         return $this->message;
     }
@@ -83,9 +86,9 @@ abstract class AbstractMessage
      * @param string $message The message
      * @return void
      */
-    public function setMessage($message)
+    public function setMessage(string $message)
     {
-        $this->message = (string)$message;
+        $this->message = $message;
     }
 
     /**
@@ -93,7 +96,7 @@ abstract class AbstractMessage
      *
      * @return int The message' severity, must be one of AbstractMessage::INFO or similar contstants
      */
-    public function getSeverity()
+    public function getSeverity() : int
     {
         return $this->severity;
     }
@@ -104,9 +107,9 @@ abstract class AbstractMessage
      * @param int $severity The severity, must be one of AbstractMessage::INFO or similar constants
      * @return void
      */
-    public function setSeverity($severity = self::OK)
+    public function setSeverity(int $severity = self::OK)
     {
-        $this->severity = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($severity, self::NOTICE, self::ERROR, self::OK);
+        $this->severity = MathUtility::forceIntegerInRange($severity, self::NOTICE, self::ERROR, self::OK);
     }
 
     /**
@@ -118,13 +121,14 @@ abstract class AbstractMessage
     public function __toString()
     {
         $severities = [
+            self::NOTICE => 'NOTICE',
             self::INFO => 'INFO',
             self::OK => 'OK',
             self::WARNING => 'WARNING',
             self::ERROR => 'ERROR'
         ];
         $title = '';
-        if (!empty($this->title)) {
+        if ($this->title !== '') {
             $title = ' - ' . $this->title;
         }
         return $severities[$this->severity] . $title . ': ' . $this->message;
index b8e5b56..5b75888 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+declare(strict_types=1);
 namespace TYPO3\CMS\Core\Messaging;
 
 /*
@@ -14,6 +15,8 @@ namespace TYPO3\CMS\Core\Messaging;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+
 /**
  * A class representing flash messages.
  */
@@ -28,6 +31,7 @@ class FlashMessage extends AbstractMessage
 
     /**
      * @var string The message severity class names
+     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9
      */
     protected $classes = [
         self::NOTICE => 'notice',
@@ -39,6 +43,7 @@ class FlashMessage extends AbstractMessage
 
     /**
      * @var string The message severity icon names
+     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9
      */
     protected $icons = [
         self::NOTICE => 'lightbulb-o',
@@ -89,9 +94,11 @@ class FlashMessage extends AbstractMessage
      * Gets the message severity class name
      *
      * @return string The message severity class name
+     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9
      */
     public function getClass()
     {
+        GeneralUtility::logDeprecatedFunction();
         return 'alert-' . $this->classes[$this->severity];
     }
 
@@ -99,37 +106,11 @@ class FlashMessage extends AbstractMessage
      * Gets the message severity icon name
      *
      * @return string The message severity icon name
+     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9
      */
     public function getIconName()
     {
+        GeneralUtility::logDeprecatedFunction();
         return $this->icons[$this->severity];
     }
-
-    /**
-     * Gets the message rendered as clean and secure markup
-     *
-     * @return string
-     */
-    public function getMessageAsMarkup()
-    {
-        $messageTitle = $this->getTitle();
-        $markup = [];
-        $markup[] = '<div class="alert ' . htmlspecialchars($this->getClass()) . '">';
-        $markup[] = '    <div class="media">';
-        $markup[] = '        <div class="media-left">';
-        $markup[] = '            <span class="fa-stack fa-lg">';
-        $markup[] = '                <i class="fa fa-circle fa-stack-2x"></i>';
-        $markup[] = '                <i class="fa fa-' . htmlspecialchars($this->getIconName()) . ' fa-stack-1x"></i>';
-        $markup[] = '            </span>';
-        $markup[] = '        </div>';
-        $markup[] = '        <div class="media-body">';
-        if (!empty($messageTitle)) {
-            $markup[] = '            <h4 class="alert-title">' . htmlspecialchars($messageTitle) . '</h4>';
-        }
-        $markup[] = '            <p class="alert-message">' . htmlspecialchars($this->getMessage()) . '</p>';
-        $markup[] = '        </div>';
-        $markup[] = '    </div>';
-        $markup[] = '</div>';
-        return implode('', $markup);
-    }
 }
index e3c51ad..cac6dde 100644 (file)
@@ -15,6 +15,8 @@ namespace TYPO3\CMS\Core\Messaging;
  */
 
 use TYPO3\CMS\Core\Authentication\AbstractUserAuthentication;
+use TYPO3\CMS\Core\Messaging\Renderer\FlashMessageRendererInterface;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
  * A class which collects and renders flash messages.
@@ -197,19 +199,21 @@ class FlashMessageQueue extends \SplQueue
     /**
      * Fetches and renders all available flash messages from the queue.
      *
-     * @return string All flash messages in the queue rendered as HTML.
+     * @param FlashMessageRendererInterface|null $flashMessageRenderer
+     * @return string All flash messages in the queue rendered by context based FlashMessageRendererResolver.
      */
-    public function renderFlashMessages()
+    public function renderFlashMessages(FlashMessageRendererInterface $flashMessageRenderer = null)
     {
         $content = '';
         $flashMessages = $this->getAllMessagesAndFlush();
+
         if (!empty($flashMessages)) {
-            $content .= '<div class="typo3-messages">';
-            foreach ($flashMessages as $flashMessage) {
-                $content .= $flashMessage->getMessageAsMarkup();
+            if ($flashMessageRenderer === null) {
+                $flashMessageRenderer = GeneralUtility::makeInstance(FlashMessageRendererResolver::class)->resolve();
             }
-            $content .= '</div>';
+            $content = $flashMessageRenderer->render($flashMessages);
         }
+
         return $content;
     }
 
diff --git a/typo3/sysext/core/Classes/Messaging/FlashMessageRendererResolver.php b/typo3/sysext/core/Classes/Messaging/FlashMessageRendererResolver.php
new file mode 100644 (file)
index 0000000..c19d399
--- /dev/null
@@ -0,0 +1,92 @@
+<?php
+declare(strict_types=1);
+namespace TYPO3\CMS\Core\Messaging;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Core\Messaging\Renderer\FlashMessageRendererInterface;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+
+/**
+ * A class for rendering flash messages.
+ */
+class FlashMessageRendererResolver
+{
+    /**
+     * @var array
+     */
+    protected $renderer = [
+        'BE' => Renderer\BootstrapRenderer::class,
+        'FE' => Renderer\ListRenderer::class,
+        'CLI' => Renderer\PlaintextRenderer::class,
+        '_default' => Renderer\PlaintextRenderer::class,
+    ];
+
+    /**
+     * This method resolves a FlashMessageRendererInterface for the given $context.
+     *
+     * In case $context is null, the context will be detected automatic.
+     *
+     * @return FlashMessageRendererInterface
+     */
+    public function resolve() : FlashMessageRendererInterface
+    {
+        $rendererClass = $this->resolveFlashMessageRenderClass();
+        $renderer = GeneralUtility::makeInstance($rendererClass);
+        if (!$renderer instanceof FlashMessageRendererInterface) {
+            throw new \RuntimeException('Renderer ' . get_class($renderer)
+                . ' does not implement FlashMessageRendererInterface', 1476958086);
+        }
+        return $renderer;
+    }
+
+    /**
+     * This method resolves the renderer class by given context.
+     *
+     * @return string
+     */
+    protected function resolveFlashMessageRenderClass() : string
+    {
+        $context = $this->resolveContext();
+        $renderClass = $this->renderer['_default'];
+
+        if (!empty($this->renderer[$context])) {
+            $renderClass = $this->renderer[$context];
+        }
+
+        return $renderClass;
+    }
+
+    /**
+     * This method detect the current context and return one of the
+     * following strings:
+     * - FE
+     * - BE
+     * - CLI
+     *
+     * @return string
+     */
+    protected function resolveContext() : string
+    {
+        $context = '';
+        if (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_CLI) {
+            $context = 'CLI';
+        } elseif (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_BE) {
+            $context = 'BE';
+        } elseif (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_FE) {
+            $context = 'FE';
+        }
+        return $context;
+    }
+}
index 90579a7..2bccb30 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+declare(strict_types=1);
 namespace TYPO3\CMS\Core\Messaging;
 
 /*
@@ -14,15 +15,18 @@ namespace TYPO3\CMS\Core\Messaging;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Core\SingletonInterface;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+
 /**
  * A class representing flash messages.
  */
-class FlashMessageService implements \TYPO3\CMS\Core\SingletonInterface
+class FlashMessageService implements SingletonInterface
 {
     /**
      * Array of \TYPO3\CMS\Core\Messaging\FlashMessageQueue objects
      *
-     * @var array
+     * @var FlashMessageQueue[]
      */
     protected $flashMessageQueues = [];
 
@@ -31,14 +35,14 @@ class FlashMessageService implements \TYPO3\CMS\Core\SingletonInterface
      * If no queue exists, an empty one will be created.
      *
      * @param string $identifier
-     * @return \TYPO3\CMS\Core\Messaging\FlashMessageQueue
+     * @return FlashMessageQueue
      * @api
      */
-    public function getMessageQueueByIdentifier($identifier = 'core.template.flashMessages')
+    public function getMessageQueueByIdentifier($identifier = 'core.template.flashMessages') : FlashMessageQueue
     {
         if (!isset($this->flashMessageQueues[$identifier])) {
-            $this->flashMessageQueues[$identifier] = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
-                \TYPO3\CMS\Core\Messaging\FlashMessageQueue::class,
+            $this->flashMessageQueues[$identifier] = GeneralUtility::makeInstance(
+                FlashMessageQueue::class,
                 $identifier
             );
         }
diff --git a/typo3/sysext/core/Classes/Messaging/Renderer/BootstrapRenderer.php b/typo3/sysext/core/Classes/Messaging/Renderer/BootstrapRenderer.php
new file mode 100644 (file)
index 0000000..3d74501
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+declare(strict_types=1);
+namespace TYPO3\CMS\Core\Messaging\Renderer;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Core\Messaging\FlashMessage;
+
+/**
+ * A class representing a bootstrap flash messages.
+ * This class renders flash messages as markup, based on the
+ * bootstrap HTML/CSS framework. It is used in backend context.
+ * The created output contains all classes which are required for
+ * the TYPO3 backend. Any kind of message contains also a nice icon.
+ */
+class BootstrapRenderer implements FlashMessageRendererInterface
+{
+    /**
+     * @var string The message severity class names
+     */
+    protected static $classes = [
+        FlashMessage::NOTICE => 'notice',
+        FlashMessage::INFO => 'info',
+        FlashMessage::OK => 'success',
+        FlashMessage::WARNING => 'warning',
+        FlashMessage::ERROR => 'danger'
+    ];
+
+    /**
+     * @var string The message severity icon names
+     */
+    protected static $icons = [
+        FlashMessage::NOTICE => 'lightbulb-o',
+        FlashMessage::INFO => 'info',
+        FlashMessage::OK => 'check',
+        FlashMessage::WARNING => 'exclamation',
+        FlashMessage::ERROR => 'times'
+    ];
+
+    /**
+     * Render method
+     *
+     * @param FlashMessage[] $flashMessages
+     * @return string Representation of the flash message
+     */
+    public function render(array $flashMessages) : string
+    {
+        return $this->getMessageAsMarkup($flashMessages);
+    }
+
+    /**
+     * Gets the message severity class name
+     *
+     * @param FlashMessage $flashMessage
+     *
+     * @return string The message severity class name
+     */
+    protected function getClass(FlashMessage $flashMessage) : string
+    {
+        return 'alert-' . self::$classes[$flashMessage->getSeverity()];
+    }
+
+    /**
+     * Gets the message severity icon name
+     *
+     * @param FlashMessage $flashMessage
+     *
+     * @return string The message severity icon name
+     */
+    protected function getIconName(FlashMessage $flashMessage) : string
+    {
+        return self::$icons[$flashMessage->getSeverity()];
+    }
+
+    /**
+     * Gets the message rendered as clean and secure markup
+     *
+     * @param FlashMessage[] $flashMessages
+     * @return string
+     */
+    protected function getMessageAsMarkup(array $flashMessages) : string
+    {
+        $markup = [];
+        $markup[] = '<div class="typo3-messages">';
+        foreach ($flashMessages as $flashMessage) {
+            $messageTitle = $flashMessage->getTitle();
+            $markup[] = '<div class="alert ' . htmlspecialchars($this->getClass($flashMessage)) . '">';
+            $markup[] = '  <div class="media">';
+            $markup[] = '    <div class="media-left">';
+            $markup[] = '      <span class="fa-stack fa-lg">';
+            $markup[] = '        <i class="fa fa-circle fa-stack-2x"></i>';
+            $markup[] = '        <i class="fa fa-' . htmlspecialchars($this->getIconName($flashMessage)) . ' fa-stack-1x"></i>';
+            $markup[] = '      </span>';
+            $markup[] = '    </div>';
+            $markup[] = '    <div class="media-body">';
+            if ($messageTitle !== '') {
+                $markup[] = '      <h4 class="alert-title">' . htmlspecialchars($messageTitle) . '</h4>';
+            }
+            $markup[] = '      <p class="alert-message">' . htmlspecialchars($flashMessage->getMessage()) . '</p>';
+            $markup[] = '    </div>';
+            $markup[] = '  </div>';
+            $markup[] = '</div>';
+        }
+        $markup[] = '</div>';
+        return implode('', $markup);
+    }
+}
diff --git a/typo3/sysext/core/Classes/Messaging/Renderer/FlashMessageRendererInterface.php b/typo3/sysext/core/Classes/Messaging/Renderer/FlashMessageRendererInterface.php
new file mode 100644 (file)
index 0000000..639d7e9
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+declare(strict_types=1);
+namespace TYPO3\CMS\Core\Messaging\Renderer;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Core\Messaging\FlashMessage;
+
+/**
+ * Interface must be implemented by all flash message renderer classes
+ */
+interface FlashMessageRendererInterface
+{
+    /**
+     * Render method
+     *
+     * @param FlashMessage[] $flashMessages
+     * @return string Representation of the flash message
+     */
+    public function render(array $flashMessages) : string;
+}
diff --git a/typo3/sysext/core/Classes/Messaging/Renderer/ListRenderer.php b/typo3/sysext/core/Classes/Messaging/Renderer/ListRenderer.php
new file mode 100644 (file)
index 0000000..fbc1108
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+declare(strict_types=1);
+namespace TYPO3\CMS\Core\Messaging\Renderer;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Core\Messaging\FlashMessage;
+
+/**
+ * A class representing a html flash message as unordered markup list.
+ * It is used in frontend context per default.
+ * The created output contains css classes which can be used to style
+ * the output individual. Any message contains the message and an
+ * optional title which is rendered as <h4> tag if it is set in
+ * the FlashMessage object.
+ */
+class ListRenderer implements FlashMessageRendererInterface
+{
+    /**
+     * @var string The message severity class names
+     */
+    protected static $classes = [
+        FlashMessage::NOTICE => 'notice',
+        FlashMessage::INFO => 'info',
+        FlashMessage::OK => 'success',
+        FlashMessage::WARNING => 'warning',
+        FlashMessage::ERROR => 'danger'
+    ];
+
+    /**
+     * @var string The message severity icon names
+     */
+    protected static $icons = [
+        FlashMessage::NOTICE => 'lightbulb-o',
+        FlashMessage::INFO => 'info',
+        FlashMessage::OK => 'check',
+        FlashMessage::WARNING => 'exclamation',
+        FlashMessage::ERROR => 'times'
+    ];
+
+    /**
+     * Render method
+     *
+     * @param FlashMessage[] $flashMessages
+     * @return string Representation of the flash message
+     */
+    public function render(array $flashMessages) : string
+    {
+        return $this->getMessageAsMarkup($flashMessages);
+    }
+
+    /**
+     * Gets the message severity class name
+     *
+     * @param FlashMessage $flashMessage
+     *
+     * @return string The message severity class name
+     */
+    protected function getClass(FlashMessage $flashMessage) : string
+    {
+        return 'alert-' . self::$classes[$flashMessage->getSeverity()];
+    }
+
+    /**
+     * Gets the message severity icon name
+     *
+     * @param FlashMessage $flashMessage
+     *
+     * @return string The message severity icon name
+     */
+    protected function getIconName(FlashMessage $flashMessage) : string
+    {
+        return self::$icons[$flashMessage->getSeverity()];
+    }
+
+    /**
+     * Gets the message rendered as clean and secure markup
+     *
+     * @param FlashMessage[] $flashMessages
+     * @return string
+     */
+    protected function getMessageAsMarkup(array $flashMessages) : string
+    {
+        $markup = [];
+        $markup[] = '<ul class="typo3-messages">';
+        foreach ($flashMessages as $flashMessage) {
+            $messageTitle = $flashMessage->getTitle();
+            $markup[] = '<li class="alert ' . htmlspecialchars($this->getClass($flashMessage)) . '">';
+            if ($messageTitle !== '') {
+                $markup[] = '<h4 class="alert-title">' . htmlspecialchars($messageTitle) . '</h4>';
+            }
+            $markup[] = '<p class="alert-message">' . htmlspecialchars($flashMessage->getMessage()) . '</p>';
+            $markup[] = '</li>';
+        }
+        $markup[] = '</ul>';
+        return implode('', $markup);
+    }
+}
diff --git a/typo3/sysext/core/Classes/Messaging/Renderer/PlaintextRenderer.php b/typo3/sysext/core/Classes/Messaging/Renderer/PlaintextRenderer.php
new file mode 100644 (file)
index 0000000..52f58e3
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+declare(strict_types=1);
+namespace TYPO3\CMS\Core\Messaging\Renderer;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Core\Messaging\FlashMessage;
+
+/**
+ * A class representing a html flash message as plain text.
+ * It is used in CLI context per default.
+ * The created output contains at least the severity and the message
+ * in the following format:
+ * [SEVERITY] <message>
+ *
+ * Example:
+ * [ERROR] No record found
+ *
+ * In case the FlashMessage object contains also a title, the
+ * following format is used:
+ * [SEVERITY] <title>: <message>
+ *
+ * Example:
+ * [ERROR] An error occurred: No record found
+ *
+ * Multiple messages are separated by a new line (LF).
+ */
+class PlaintextRenderer implements FlashMessageRendererInterface
+{
+    /**
+     * Message types
+     * @var array
+     */
+    protected static $type = [
+        FlashMessage::NOTICE => 'NOTICE',
+        FlashMessage::INFO => 'INFO',
+        FlashMessage::OK => 'SUCCESS',
+        FlashMessage::WARNING => 'WARNING',
+        FlashMessage::ERROR => 'DANGER'
+    ];
+
+    /**
+     * Render method
+     *
+     * @param FlashMessage[] $flashMessages
+     * @return string Representation of the flash message as plain text
+     */
+    public function render(array $flashMessages) : string
+    {
+        $messages = [];
+
+        foreach ($flashMessages as $flashMessage) {
+            $message = $flashMessage->getMessage();
+            if ($flashMessage->getTitle() !== '') {
+                $message = $flashMessage->getTitle() . ': ' . $message;
+            }
+            $messages[] = '[' . self::$type[$flashMessage->getSeverity()] . '] ' . $message;
+        }
+        return implode(LF, $messages);
+    }
+}
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-78477-RefactoringOfFlashMessageRendering.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-78477-RefactoringOfFlashMessageRendering.rst
new file mode 100644 (file)
index 0000000..817fb28
--- /dev/null
@@ -0,0 +1,42 @@
+.. include:: ../../Includes.txt
+
+========================================================
+Breaking: #78477 - Refactoring of FlashMessage rendering
+========================================================
+
+See :issue:`78477`
+
+Description
+===========
+
+The FlashMessageViewHelper was refactored and no longer inherits from the TagBasedViewHelper.
+
+Impact
+======
+
+The FlashMessageViewHelper outputs default context specific markup. Adding own classes or tag attributes
+is no longer possible.
+
+Affected Installations
+======================
+
+All installations using the FlashMessageViewHelper with tag specific attributes.
+
+
+Migration
+=========
+
+Remove the tag specific attributes and style the default output. If you need custom output use the possibility to render FlashMessages yourself, for example:
+
+.. code-block:: html
+
+       <f:flashMessages as="flashMessages">
+           <dl class="messages">
+               <f:for each="{flashMessages}" as="flashMessage">
+                  <dt>CODE!! {flashMessage.code}</dt>
+                  <dd>MESSAGE:: {flashMessage.message}</dd>
+               </f:for>
+           </dl>
+       </f:flashMessages>
+
+.. index:: Backend, Fluid, Frontend
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-78477-RefactoringOfFlashMessageRenderingViewHelper.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-78477-RefactoringOfFlashMessageRenderingViewHelper.rst
new file mode 100644 (file)
index 0000000..ce85648
--- /dev/null
@@ -0,0 +1,37 @@
+.. include:: ../../Includes.txt
+
+========================================================
+Breaking: #78477 - Refactoring of FlashMessage rendering
+========================================================
+
+See :issue:`78477`
+
+Description
+===========
+
+The following method has been removed:
+
+* :php:`FlashMessage->getMessageAsMarkup()`
+
+Impact
+======
+
+Using this method will stop working immediately.
+
+
+Affected Installations
+======================
+
+All installations using the mentioned method above.
+
+
+Migration
+=========
+
+Use the new :php:`FlashMessageRendererResolver::class`, for example:
+
+.. code-block:: php
+
+       GeneralUtility::makeInstance(FlashMessageRendererResolver::class)->resolve()->render()
+
+.. index:: Backend, PHP-API
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-78477-RefactoringOfFlashMessageRendering.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-78477-RefactoringOfFlashMessageRendering.rst
new file mode 100644 (file)
index 0000000..83e1af7
--- /dev/null
@@ -0,0 +1,41 @@
+.. include:: ../../Includes.txt
+
+===========================================================
+Deprecation: #78477 - Refactoring of FlashMessage rendering
+===========================================================
+
+See :issue:`78477`
+
+Description
+===========
+
+The following methods and properties within :php:`FlashMessage::class` have been marked as deprecated:
+
+* :php:`FlashMessage->classes`
+* :php:`FlashMessage->icons`
+* :php:`FlashMessage->getClass()`
+* :php:`FlashMessage->getIconName()`
+
+Impact
+======
+
+Using this properties and methods will stop working in TYPO3 v9.
+
+
+Affected Installations
+======================
+
+All installations using the mentioned methods and properties above.
+
+
+Migration
+=========
+
+Use the new :php:`FlashMessageRendererResolver::class`, for example:
+
+
+.. code-block:: php
+
+       GeneralUtility::makeInstance(FlashMessageRendererResolver::class)->resolve()->render()
+
+.. index:: Backend, PHP-API
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-78477-RefactoringOfFlashMessageRendering.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-78477-RefactoringOfFlashMessageRendering.rst
new file mode 100644 (file)
index 0000000..5cbaa7e
--- /dev/null
@@ -0,0 +1,40 @@
+.. include:: ../../Includes.txt
+
+=======================================================
+Feature: #78477 - Refactoring of FlashMessage rendering
+=======================================================
+
+See :issue:`78477`
+
+Description
+===========
+
+The implementation of rendering FlashMessages in the core has been optimized.
+With :issue:`73698` a cleanup has been started to centralize the markup within the FlashMessage class.
+
+A new class called :php:`FlashMessageRendererResolver` has been introduced.
+This class detects the context and renders the given FlashMessages in the correct output format.
+It can handle any kind of output format.
+The following FlashMessageRendererResolver classes have been introduced:
+
+* :php:`TYPO3\CMS\Core\Messaging\Renderer\BootstrapRenderer` (is used in backend context by default)
+* :php:`TYPO3\CMS\Core\Messaging\Renderer\ListRenderer` (is used in frontend context by default)
+* :php:`TYPO3\CMS\Core\Messaging\Renderer\PlaintextRenderer` (is used in CLI context by default)
+
+All new rendering classes have to implement the :php:`TYPO3\CMS\Core\Messaging\Renderer\FlashMessageRendererInterface` interface.
+
+
+Impact
+======
+
+The core has been modified to use the new :php:`FlashMessageRendererResolver`.
+Any third party extension should use the provided :php:`FlashMessageViewHelper` or the new :php:`FlashMessageRendererResolver` class:
+
+.. code-block:: php
+
+   $out = GeneralUtility::makeInstance(FlashMessageRendererResolver::class)
+      ->resolve()
+      ->render($flashMessages);
+
+
+.. index:: Backend, PHP-API
index b18286b..b8f6c84 100644 (file)
@@ -42,8 +42,8 @@ class FlashMessageQueueTest extends \TYPO3\CMS\Components\TestingFramework\Core\
         $this->setUpBackendUserFromFixture(1);
         $flashMessageQueue = new FlashMessageQueue('core.template.flashMessages');
         $messages = [
-            0 => new FlashMessage('This is a test message', 1, FlashMessage::NOTICE),
-            1 => new FlashMessage('This is another test message', 2, FlashMessage::WARNING)
+            0 => new FlashMessage('This is a test message', '1', FlashMessage::NOTICE),
+            1 => new FlashMessage('This is another test message', '2', FlashMessage::WARNING)
         ];
         $flashMessageQueue->enqueue($messages[0]);
         $flashMessageQueue->enqueue($messages[1]);
@@ -90,8 +90,8 @@ class FlashMessageQueueTest extends \TYPO3\CMS\Components\TestingFramework\Core\
         $this->setUpBackendUserFromFixture(1);
         $flashMessageQueue = new FlashMessageQueue('core.template.flashMessages');
         $messages = [
-            0 => new FlashMessage('This is a test message', 1, FlashMessage::NOTICE),
-            1 => new FlashMessage('This is another test message', 2, FlashMessage::WARNING)
+            0 => new FlashMessage('This is a test message', '1', FlashMessage::NOTICE),
+            1 => new FlashMessage('This is another test message', '2', FlashMessage::WARNING)
         ];
         $flashMessageQueue->addMessage($messages[0]);
         $flashMessageQueue->addMessage($messages[1]);
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageRendererResolverTest.php b/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageRendererResolverTest.php
new file mode 100644 (file)
index 0000000..decb225
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+namespace TYPO3\CMS\Core\Tests\Unit\Messaging;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Components\TestingFramework\Core\UnitTestCase;
+use TYPO3\CMS\Core\Messaging\FlashMessageRendererResolver;
+use TYPO3\CMS\Core\Messaging\Renderer\FlashMessageRendererInterface;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+
+/**
+ * Test case
+ */
+class FlashMessageRendererResolverTest extends UnitTestCase
+{
+
+    /**
+     * @test
+     */
+    public function flashMessageRendererResolverResolveRendererWithoutContext()
+    {
+        $rendererClass = GeneralUtility::makeInstance(FlashMessageRendererResolver::class)->resolve();
+        $this->assertInstanceOf(FlashMessageRendererInterface::class, $rendererClass);
+    }
+}
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/Renderer/BootstrapRendererTest.php b/typo3/sysext/core/Tests/Unit/Messaging/Renderer/BootstrapRendererTest.php
new file mode 100644 (file)
index 0000000..14b26a2
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+namespace TYPO3\CMS\Core\Tests\Unit\Messaging;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Components\TestingFramework\Core\UnitTestCase;
+use TYPO3\CMS\Core\Messaging\FlashMessage;
+use TYPO3\CMS\Core\Messaging\Renderer\BootstrapRenderer;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+
+/**
+ * Test case
+ */
+class BootstrapRendererTest extends UnitTestCase
+{
+    /**
+     * @test
+     */
+    public function renderCreatesCorrectOutputForFlashMessage()
+    {
+        $rendererClass = GeneralUtility::makeInstance(BootstrapRenderer::class);
+        $flashMessage = GeneralUtility::makeInstance(
+            FlashMessage::class,
+            'messageBody',
+            'messageTitle',
+            FlashMessage::NOTICE
+        );
+        $output = $rendererClass->render([$flashMessage]);
+        $this->assertContains('<div class="typo3-messages">', $output);
+        $this->assertContains('<div class="alert alert-notice">', $output);
+        $this->assertContains('<div class="media-body">', $output);
+        $this->assertContains('<h4 class="alert-title">messageTitle</h4>', $output);
+        $this->assertContains('<p class="alert-message">messageBody</p>', $output);
+    }
+
+    /**
+     * @test
+     */
+    public function renderCreatesCorrectOutputForFlashMessageWithoutTitle()
+    {
+        $rendererClass = GeneralUtility::makeInstance(BootstrapRenderer::class);
+        $flashMessage = GeneralUtility::makeInstance(
+            FlashMessage::class,
+            'messageBody',
+            '',
+            FlashMessage::NOTICE
+        );
+        $output = $rendererClass->render([$flashMessage]);
+        $this->assertContains('<div class="typo3-messages">', $output);
+        $this->assertContains('<div class="alert alert-notice">', $output);
+        $this->assertContains('<div class="media-body">', $output);
+        $this->assertContains('<p class="alert-message">messageBody</p>', $output);
+        $this->assertNotContains('<h4 class="alert-title">messageTitle</h4>', $output);
+    }
+}
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/Renderer/ListRendererTest.php b/typo3/sysext/core/Tests/Unit/Messaging/Renderer/ListRendererTest.php
new file mode 100644 (file)
index 0000000..d2f3ba6
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+namespace TYPO3\CMS\Core\Tests\Unit\Messaging;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Components\TestingFramework\Core\UnitTestCase;
+use TYPO3\CMS\Core\Messaging\FlashMessage;
+use TYPO3\CMS\Core\Messaging\Renderer\ListRenderer;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+
+/**
+ * Test case
+ */
+class ListRendererTest extends UnitTestCase
+{
+    /**
+     * @test
+     */
+    public function renderCreatesCorrectOutputForFlashMessage()
+    {
+        $rendererClass = GeneralUtility::makeInstance(ListRenderer::class);
+        $flashMessage = GeneralUtility::makeInstance(
+            FlashMessage::class,
+            'messageBody',
+            'messageTitle',
+            FlashMessage::NOTICE
+        );
+        $this->assertSame('<ul class="typo3-messages"><li class="alert alert-notice"><h4 class="alert-title">messageTitle</h4><p class="alert-message">messageBody</p></li></ul>', $rendererClass->render([$flashMessage]));
+    }
+
+    /**
+     * @test
+     */
+    public function renderCreatesCorrectOutputForFlashMessageWithoutTitle()
+    {
+        $rendererClass = GeneralUtility::makeInstance(ListRenderer::class);
+        $flashMessage = GeneralUtility::makeInstance(
+            FlashMessage::class,
+            'messageBody',
+            '',
+            FlashMessage::NOTICE
+        );
+        $this->assertSame('<ul class="typo3-messages"><li class="alert alert-notice"><p class="alert-message">messageBody</p></li></ul>', $rendererClass->render([$flashMessage]));
+    }
+}
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/Renderer/PlaintextRendererTest.php b/typo3/sysext/core/Tests/Unit/Messaging/Renderer/PlaintextRendererTest.php
new file mode 100644 (file)
index 0000000..f363fe0
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+namespace TYPO3\CMS\Core\Tests\Unit\Messaging;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Components\TestingFramework\Core\UnitTestCase;
+use TYPO3\CMS\Core\Messaging\FlashMessage;
+use TYPO3\CMS\Core\Messaging\Renderer\PlaintextRenderer;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+
+/**
+ * Test case
+ */
+class PlaintextRendererTest extends UnitTestCase
+{
+    /**
+     * @test
+     */
+    public function renderCreatesCorrectOutputForFlashMessage()
+    {
+        $rendererClass = GeneralUtility::makeInstance(PlaintextRenderer::class);
+        $flashMessage = GeneralUtility::makeInstance(
+            FlashMessage::class,
+            'messageBody',
+            'messageTitle',
+            FlashMessage::NOTICE
+        );
+        $this->assertSame('[NOTICE] messageTitle: messageBody', $rendererClass->render([$flashMessage]));
+    }
+
+    /**
+     * @test
+     */
+    public function renderCreatesCorrectOutputForFlashMessageWithoutTitle()
+    {
+        $rendererClass = GeneralUtility::makeInstance(PlaintextRenderer::class);
+        $flashMessage = GeneralUtility::makeInstance(
+            FlashMessage::class,
+            'messageBody',
+            '',
+            FlashMessage::NOTICE
+        );
+        $this->assertSame('[NOTICE] messageBody', $rendererClass->render([$flashMessage]));
+    }
+}
index f32cc55..9832d28 100644 (file)
@@ -13,7 +13,10 @@ namespace TYPO3\CMS\Fluid\ViewHelpers;
  *
  * The TYPO3 project - inspiring people to share!
  */
-use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper;
+
+use TYPO3\CMS\Core\Messaging\FlashMessageRendererResolver;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
  * View helper which renders the flash messages (if there are any) as an unsorted list.
@@ -27,16 +30,7 @@ use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper;
  * <f:flashMessages />
  * </code>
  * <output>
- * An ul-list of flash messages.
- * </output>
- *
- * <code title="Output with custom css class">
- * <f:flashMessages class="specialClass" />
- * </code>
- * <output>
- * <div class="specialClass">
- * ...
- * </ul>
+ * A list of flash messages.
  * </output>
  *
  * <code title="TYPO3 core style">
@@ -83,12 +77,14 @@ use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper;
  *
  * @api
  */
-class FlashMessagesViewHelper extends AbstractTagBasedViewHelper
+class FlashMessagesViewHelper extends AbstractViewHelper
 {
     /**
-     * @var string
+     * ViewHelper outputs HTML therefore output escaping has to be disabled
+     *
+     * @var bool
      */
-    protected $tagName = 'div';
+    protected $escapeOutput = false;
 
     /**
      * Initialize arguments
@@ -99,7 +95,6 @@ class FlashMessagesViewHelper extends AbstractTagBasedViewHelper
     public function initializeArguments()
     {
         parent::initializeArguments();
-        $this->registerUniversalTagAttributes();
         $this->registerArgument('queueIdentifier', 'string', 'Flash-message queue to use');
         $this->registerArgument('as', 'string', 'The name of the current flashMessage variable for rendering inside');
     }
@@ -117,7 +112,8 @@ class FlashMessagesViewHelper extends AbstractTagBasedViewHelper
     {
         $as = $this->arguments['as'];
         $queueIdentifier = isset($this->arguments['queueIdentifier']) ? $this->arguments['queueIdentifier'] : null;
-        $flashMessages = $this->renderingContext->getControllerContext()->getFlashMessageQueue($queueIdentifier)->getAllMessagesAndFlush();
+        $flashMessages = $this->renderingContext->getControllerContext()
+            ->getFlashMessageQueue($queueIdentifier)->getAllMessagesAndFlush();
         if ($flashMessages === null || count($flashMessages) === 0) {
             return '';
         }
@@ -132,22 +128,16 @@ class FlashMessagesViewHelper extends AbstractTagBasedViewHelper
     }
 
     /**
-     * Renders the flash messages as unordered list
+     * Renders the flash messages
      *
      * @param array $flashMessages \TYPO3\CMS\Core\Messaging\FlashMessage[]
      * @return string
      */
-    protected function renderDefault(array $flashMessages)
+    protected function renderDefault(array $flashMessages) : string
     {
-        $flashMessagesClass = $this->hasArgument('class') ? $this->arguments['class'] : 'typo3-messages';
-        $tagContent = '';
-        $this->tag->addAttribute('class', $flashMessagesClass);
-        /** @var $singleFlashMessage \TYPO3\CMS\Core\Messaging\FlashMessage */
-        foreach ($flashMessages as $singleFlashMessage) {
-            $tagContent .= $singleFlashMessage->getMessageAsMarkup();
-        }
-        $this->tag->setContent($tagContent);
-        return $this->tag->render();
+        return GeneralUtility::makeInstance(FlashMessageRendererResolver::class)
+            ->resolve()
+            ->render($flashMessages);
     }
 
     /**
@@ -160,7 +150,7 @@ class FlashMessagesViewHelper extends AbstractTagBasedViewHelper
      * @param string $as
      * @return string
      */
-    protected function renderFromTemplate(array $flashMessages, $as)
+    protected function renderFromTemplate(array $flashMessages, $as) : string
     {
         $templateVariableContainer = $this->renderingContext->getVariableProvider();
         $templateVariableContainer->add($as, $flashMessages);
index a2f4978..bf16977 100644 (file)
@@ -81,45 +81,6 @@ class FlashMessagesViewHelperTest extends ViewHelperBaseTestcase
     /**
      * @test
      */
-    public function renderRespectsGivenCssClass()
-    {
-        $flashMessage = new FlashMessage('test message body', 'test message title');
-
-        $this->flashMessageQueue->getAllMessagesAndFlush()->willReturn([$flashMessage]);
-        $this->setArgumentsUnderTest(
-            $this->viewHelper,
-            [
-                'class' => 'flashy',
-            ]
-        );
-        $expected = '<div class="flashy"><div class="alert alert-success">';
-        $actualResult = $this->viewHelper->initializeArgumentsAndRender();
-        $this->assertContains($expected, $actualResult);
-    }
-
-    /**
-     * @test
-     */
-    public function renderReturnsDefaultTemplate()
-    {
-        $flashMessage = new FlashMessage('test message body', 'test message title');
-
-        $this->flashMessageQueue->getAllMessagesAndFlush()->willReturn([$flashMessage]);
-        $this->setArgumentsUnderTest(
-            $this->viewHelper,
-            []
-        );
-        $expectedTitle = '<h4 class="alert-title">test message title</h4>';
-        $expectedMessage = '<p class="alert-message">test message body</p>';
-
-        $actualResult = $this->viewHelper->initializeArgumentsAndRender();
-        $this->assertContains($expectedTitle, $actualResult);
-        $this->assertContains($expectedMessage, $actualResult);
-    }
-
-    /**
-     * @test
-     */
     public function parameterAsStartsRenderingOnTemplate()
     {
         $this->viewHelper->setRenderChildrenClosure(function () {