From 3eebf358d024e16462e5ced8897a0fd34e260f77 Mon Sep 17 00:00:00 2001
From: Claus Due <claus@namelesscoder.net>
Date: Fri, 5 May 2017 03:31:07 +0200
Subject: [PATCH] [TASK] Convert ViewHelpers to static calling

Several ViewHelpers were not yet converted to use
the renderStatic method and CompileWith* traits
from Fluid. This patch converts those.

Change-Id: I17773d4014969c5ad5a3b87bffd34c14871a2958
Releases: master
Resolves: #81143
Reviewed-on: https://review.typo3.org/52707
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Jan Helke <typo3@helke.de>
Tested-by: Jan Helke <typo3@helke.de>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
---
 .../Classes/ViewHelpers/BaseViewHelper.php    | 24 ++------
 .../ViewHelpers/FlashMessagesViewHelper.php   | 60 ++++++-------------
 .../ViewHelpers/Format/CropViewHelper.php     | 28 +--------
 .../Format/HtmlentitiesDecodeViewHelper.php   | 20 ++-----
 .../Format/HtmlentitiesViewHelper.php         | 26 ++++----
 .../ViewHelpers/Format/JsonViewHelper.php     | 26 ++++----
 .../Format/StripTagsViewHelper.php            | 31 ++--------
 .../ViewHelpers/RenderChildrenViewHelper.php  | 16 +++--
 .../ViewHelpers/TranslateViewHelper.php       | 17 +-----
 .../ViewHelpers/Uri/ActionViewHelper.php      | 49 ++++++++-------
 10 files changed, 102 insertions(+), 195 deletions(-)

diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/BaseViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/BaseViewHelper.php
index d21d2ab1cb84..fd79f5db8ec4 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/BaseViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/BaseViewHelper.php
@@ -16,6 +16,7 @@ namespace TYPO3\CMS\Fluid\ViewHelpers;
 
 use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
 
 /**
  * View helper which creates a <base href="..."></base> tag. The Base URI is taken from the
@@ -36,6 +37,8 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
  */
 class BaseViewHelper extends AbstractViewHelper
 {
+    use CompileWithRenderStatic;
+
     /**
      * As this ViewHelper renders HTML, the output must not be escaped.
      *
@@ -43,24 +46,6 @@ class BaseViewHelper extends AbstractViewHelper
      */
     protected $escapeOutput = false;
 
-    /**
-     * Render the "Base" tag by outputting $request->getBaseUri()
-     *
-     * Note: renders as <base></base>, because IE6 will else refuse to display
-     * the page...
-     *
-     * @return string "base"-Tag.
-     * @api
-     */
-    public function render()
-    {
-        return static::renderStatic(
-            [],
-            $this->buildRenderChildrenClosure(),
-            $this->renderingContext
-        );
-    }
-
     /**
      * Render the "Base" tag by outputting $request->getBaseUri()
      *
@@ -76,7 +61,6 @@ class BaseViewHelper extends AbstractViewHelper
      */
     public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
     {
-        $controllerContext = $renderingContext->getControllerContext();
-        return '<base href="' . htmlspecialchars($controllerContext->getRequest()->getBaseUri()) . '" />';
+        return '<base href="' . htmlspecialchars($renderingContext->getControllerContext()->getRequest()->getBaseUri()) . '" />';
     }
 }
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/FlashMessagesViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/FlashMessagesViewHelper.php
index 4280c08f1942..874e0061229b 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/FlashMessagesViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/FlashMessagesViewHelper.php
@@ -17,6 +17,8 @@ namespace TYPO3\CMS\Fluid\ViewHelpers;
 use TYPO3\CMS\Core\Messaging\FlashMessageRendererResolver;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
+use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
 
 /**
  * View helper which renders the flash messages (if there are any) as an unsorted list.
@@ -79,6 +81,8 @@ use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
  */
 class FlashMessagesViewHelper extends AbstractViewHelper
 {
+    use CompileWithRenderStatic;
+
     /**
      * ViewHelper outputs HTML therefore output escaping has to be disabled
      *
@@ -104,58 +108,32 @@ class FlashMessagesViewHelper extends AbstractViewHelper
      * from being cached.
      *
      * @see \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController::no_cache
-     * @return string rendered Flash Messages, if there are any.
-     * @api
+     * @param array $arguments
+     * @param \Closure $renderChildrenClosure
+     * @param RenderingContextInterface $renderingContext
+     * @return mixed
      */
-    public function render()
+    public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
     {
-        $as = $this->arguments['as'];
-        $queueIdentifier = isset($this->arguments['queueIdentifier']) ? $this->arguments['queueIdentifier'] : null;
-        $flashMessages = $this->renderingContext->getControllerContext()
+        $as = $arguments['as'];
+        $queueIdentifier = isset($arguments['queueIdentifier']) ? $arguments['queueIdentifier'] : null;
+        $flashMessages = $renderingContext->getControllerContext()
             ->getFlashMessageQueue($queueIdentifier)->getAllMessagesAndFlush();
         if ($flashMessages === null || count($flashMessages) === 0) {
             return '';
         }
 
         if ($as === null) {
-            $content = $this->renderDefault($flashMessages);
+            return GeneralUtility::makeInstance(FlashMessageRendererResolver::class)
+                ->resolve()
+                ->render($flashMessages);
         } else {
-            $content = $this->renderFromTemplate($flashMessages, $as);
+            $templateVariableContainer = $renderingContext->getVariableProvider();
+            $templateVariableContainer->add($as, $flashMessages);
+            $content = $renderChildrenClosure();
+            $templateVariableContainer->remove($as);
         }
 
         return $content;
     }
-
-    /**
-     * Renders the flash messages
-     *
-     * @param array $flashMessages \TYPO3\CMS\Core\Messaging\FlashMessage[]
-     * @return string
-     */
-    protected function renderDefault(array $flashMessages) : string
-    {
-        return GeneralUtility::makeInstance(FlashMessageRendererResolver::class)
-            ->resolve()
-            ->render($flashMessages);
-    }
-
-    /**
-     * Renders the flash messages as nested divs
-     * Defer the rendering of Flash Messages to the template. In this case,
-     * the flash messages are stored in the template inside the variable specified
-     * in "as".
-     *
-     * @param array $flashMessages \TYPO3\CMS\Core\Messaging\FlashMessage[]
-     * @param string $as
-     * @return string
-     */
-    protected function renderFromTemplate(array $flashMessages, $as) : string
-    {
-        $templateVariableContainer = $this->renderingContext->getVariableProvider();
-        $templateVariableContainer->add($as, $flashMessages);
-        $content = $this->renderChildren();
-        $templateVariableContainer->remove($as);
-
-        return $content;
-    }
 }
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Format/CropViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Format/CropViewHelper.php
index 19e8ac851ce1..c228d7cf215f 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Format/CropViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Format/CropViewHelper.php
@@ -19,6 +19,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
 use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
 
 /**
  * Use this view helper to crop the text between its opening and closing tags.
@@ -63,6 +64,8 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
  */
 class CropViewHelper extends AbstractViewHelper
 {
+    use CompileWithRenderStatic;
+
     /**
      * The output may contain HTML and can not be escaped.
      *
@@ -84,31 +87,6 @@ class CropViewHelper extends AbstractViewHelper
         $this->registerArgument('respectHtml', 'bool', 'If TRUE the cropped string will respect HTML tags and entities. Technically that means, that cropHTML() is called rather than crop()', false, true);
     }
 
-    /**
-     * Render the cropped text.
-     *
-     * @return string cropped text
-     * @throws \InvalidArgumentException
-     */
-    public function render()
-    {
-        $maxCharacters = $this->arguments['maxCharacters'];
-        $append = $this->arguments['append'];
-        $respectWordBoundaries = $this->arguments['respectWordBoundaries'];
-        $respectHtml = $this->arguments['respectHtml'];
-
-        return static::renderStatic(
-            [
-                'maxCharacters' => $maxCharacters,
-                'append' => $append,
-                'respectWordBoundaries' => $respectWordBoundaries,
-                'respectHtml' => $respectHtml,
-            ],
-            $this->buildRenderChildrenClosure(),
-            $this->renderingContext
-        );
-    }
-
     /**
      * @param array $arguments
      * @param \Closure $renderChildrenClosure
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Format/HtmlentitiesDecodeViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Format/HtmlentitiesDecodeViewHelper.php
index 0097c074bc41..9ed1a22b84a4 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Format/HtmlentitiesDecodeViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Format/HtmlentitiesDecodeViewHelper.php
@@ -15,6 +15,7 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Format;
  */
 
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithContentArgumentAndRenderStatic;
 
 /**
  * Applies html_entity_decode() to a value
@@ -40,6 +41,8 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
  */
 class HtmlentitiesDecodeViewHelper extends AbstractEncodingViewHelper
 {
+    use CompileWithContentArgumentAndRenderStatic;
+
     /**
      * We accept value and children interchangeably, thus we must disable children escaping.
      *
@@ -68,19 +71,7 @@ class HtmlentitiesDecodeViewHelper extends AbstractEncodingViewHelper
     /**
      * Converts all HTML entities to their applicable characters as needed using PHPs html_entity_decode() function.
      *
-     * @return string the altered string
      * @see http://www.php.net/html_entity_decode
-     */
-    public function render()
-    {
-        return static::renderStatic(
-            $this->arguments,
-            $this->buildRenderChildrenClosure(),
-            $this->renderingContext
-        );
-    }
-
-    /**
      * @param array $arguments
      * @param \Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
@@ -89,13 +80,10 @@ class HtmlentitiesDecodeViewHelper extends AbstractEncodingViewHelper
      */
     public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
     {
-        $value = $arguments['value'];
+        $value = $renderChildrenClosure();
         $encoding = $arguments['encoding'];
         $keepQuotes = $arguments['keepQuotes'];
 
-        if ($value === null) {
-            $value = $renderChildrenClosure();
-        }
         if (!is_string($value)) {
             return $value;
         }
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Format/HtmlentitiesViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Format/HtmlentitiesViewHelper.php
index bb5188d43fd1..0495f1200b8f 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Format/HtmlentitiesViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Format/HtmlentitiesViewHelper.php
@@ -14,7 +14,8 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Format;
  * The TYPO3 project - inspiring people to share!
  */
 
-use TYPO3\CMS\Core\SingletonInterface;
+use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithContentArgumentAndRenderStatic;
 
 /**
  * Applies htmlentities() escaping to a value
@@ -38,8 +39,10 @@ use TYPO3\CMS\Core\SingletonInterface;
  *
  * @api
  */
-class HtmlentitiesViewHelper extends AbstractEncodingViewHelper implements SingletonInterface
+class HtmlentitiesViewHelper extends AbstractEncodingViewHelper
 {
+    use CompileWithContentArgumentAndRenderStatic;
+
     /**
      * Output gets encoded by this viewhelper
      *
@@ -68,20 +71,19 @@ class HtmlentitiesViewHelper extends AbstractEncodingViewHelper implements Singl
     /**
      * Escapes special characters with their escaped counterparts as needed using PHPs htmlentities() function.
      *
-     * @return string the altered string
      * @see http://www.php.net/manual/function.htmlentities.php
-     * @api
+     * @param array $arguments
+     * @param \Closure $renderChildrenClosure
+     * @param RenderingContextInterface $renderingContext
+     * @return mixed
      */
-    public function render()
+    public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
     {
-        $value = $this->arguments['value'];
-        $encoding = $this->arguments['encoding'];
-        $keepQuotes = $this->arguments['keepQuotes'];
-        $doubleEncode = $this->arguments['doubleEncode'];
+        $value = $renderChildrenClosure();
+        $encoding = $arguments['encoding'];
+        $keepQuotes = $arguments['keepQuotes'];
+        $doubleEncode = $arguments['doubleEncode'];
 
-        if ($value === null) {
-            $value = $this->renderChildren();
-        }
         if (!is_string($value)) {
             return $value;
         }
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Format/JsonViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Format/JsonViewHelper.php
index 3b8d16e1eb79..7f913de00fb4 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Format/JsonViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Format/JsonViewHelper.php
@@ -18,6 +18,7 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Format;
 
 use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithContentArgumentAndRenderStatic;
 
 /**
  * Wrapper for PHPs json_encode function.
@@ -50,11 +51,16 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
  */
 class JsonViewHelper extends AbstractViewHelper
 {
+    use CompileWithContentArgumentAndRenderStatic;
+
     /**
      * @var bool
      */
     protected $escapeChildren = false;
 
+    /**
+     * Initialize arguments
+     */
     public function initializeArguments()
     {
         $this->registerArgument('value', 'mixed', 'The incoming data to convert, or null if VH children should be used');
@@ -62,35 +68,23 @@ class JsonViewHelper extends AbstractViewHelper
     }
 
     /**
+     * Applies json_encode() on the specified value.
+     *
      * Outputs content with its JSON representation. To prevent issues in HTML context, occurrences
      * of greater-than or less-than characters are converted to their hexadecimal representations.
      *
      * If $forceObject is TRUE a JSON object is outputted even if the value is a non-associative array
      * Example: array('foo', 'bar') as input will not be ["foo","bar"] but {"0":"foo","1":"bar"}
      *
-     * @return string the JSON-encoded string.
-     * @see http://www.php.net/manual/en/function.json-encode.php
-     * @api
-     */
-    public function render()
-    {
-        return self::renderStatic($this->arguments, $this->buildRenderChildrenClosure(), $this->renderingContext);
-    }
-
-    /**
-     * Applies json_encode() on the specified value.
-     *
      * @param array $arguments
      * @param \Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
+     * @see http://www.php.net/manual/en/function.json-encode.php
      * @return string
      */
     public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
     {
-        $value = $arguments['value'];
-        if ($value === null) {
-            $value = $renderChildrenClosure();
-        }
+        $value = $renderChildrenClosure();
         $options = JSON_HEX_TAG;
         if ($arguments['forceObject'] !== false) {
             $options = $options | JSON_FORCE_OBJECT;
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Format/StripTagsViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Format/StripTagsViewHelper.php
index e6b52e568ca3..860172860327 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Format/StripTagsViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Format/StripTagsViewHelper.php
@@ -16,6 +16,7 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Format;
 
 use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithContentArgumentAndRenderStatic;
 
 /**
  * Removes tags from the given string (applying PHPs strip_tags() function)
@@ -42,6 +43,8 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
  */
 class StripTagsViewHelper extends AbstractViewHelper
 {
+    use CompileWithContentArgumentAndRenderStatic;
+
     /**
      * No output escaping as some tags may be allowed
      *
@@ -68,34 +71,13 @@ unction');
      */
     protected $escapeChildren = false;
 
-    /**
-     * Escapes special characters with their escaped counterparts as needed using PHPs strip_tags() function.
-     *
-     * @return mixed
-     * @see http://www.php.net/manual/function.strip-tags.php
-     * @api
-     */
-    public function render()
-    {
-        $value = $this->arguments['value'];
-        $allowedTags = $this->arguments['allowedTags'];
-
-        return static::renderStatic(
-            [
-                'value' => $value,
-                'allowedTags' => $allowedTags
-            ],
-            $this->buildRenderChildrenClosure(),
-            $this->renderingContext
-        );
-    }
-
     /**
      * Applies strip_tags() on the specified value.
      *
      * @param array $arguments
      * @param \Closure $renderChildrenClosure
      * @param \TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface $renderingContext
+     * @see http://www.php.net/manual/function.strip-tags.php
      * @return string
      */
     public static function renderStatic(
@@ -103,11 +85,8 @@ unction');
         \Closure $renderChildrenClosure,
         RenderingContextInterface $renderingContext
     ) {
-        $value = $arguments['value'];
+        $value = $renderChildrenClosure();
         $allowedTags = $arguments['allowedTags'];
-        if ($value === null) {
-            $value = $renderChildrenClosure();
-        }
         if (!is_string($value)) {
             return $value;
         }
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/RenderChildrenViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/RenderChildrenViewHelper.php
index 333b6a7be45e..61451c138e70 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/RenderChildrenViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/RenderChildrenViewHelper.php
@@ -33,16 +33,24 @@ class RenderChildrenViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abstract
     protected $escapeOutput = false;
 
     /**
-     * @param array $arguments
+     * Initialize arguments
+     */
+    public function initializeArguments()
+    {
+        parent::initializeArguments();
+        $this->registerArgument('arguments', 'array', 'Arguments to assign as template variables', false, []);
+    }
+
+    /**
      * @return string
      */
-    public function render(array $arguments = [])
+    public function render()
     {
         $renderingContext = $this->getWidgetRenderingContext();
         $widgetChildNodes = $this->getWidgetChildNodes();
-        $this->addArgumentsToTemplateVariableContainer($arguments);
+        $this->addArgumentsToTemplateVariableContainer($this->arguments['arguments']);
         $output = $widgetChildNodes->evaluate($renderingContext);
-        $this->removeArgumentsFromTemplateVariableContainer($arguments);
+        $this->removeArgumentsFromTemplateVariableContainer($this->arguments['arguments']);
         return $output;
     }
 
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/TranslateViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/TranslateViewHelper.php
index 0d3eaace9751..3046929a2f67 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/TranslateViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/TranslateViewHelper.php
@@ -17,6 +17,7 @@ use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
 use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
 use TYPO3\CMS\Fluid\Core\ViewHelper\Exception\InvalidVariableException;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
 
 /**
  * Translate a key from locallang. The files are loaded from the folder
@@ -71,6 +72,8 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
  */
 class TranslateViewHelper extends AbstractViewHelper
 {
+    use CompileWithRenderStatic;
+
     /**
      * Output is escaped already. We must not escape children, to avoid double encoding.
      *
@@ -93,20 +96,6 @@ class TranslateViewHelper extends AbstractViewHelper
         $this->registerArgument('extensionName', 'string', 'UpperCamelCased extension key (for example BlogExample)');
     }
 
-    /**
-     * Render translation
-     *
-     * @return string The translated key or tag body if key doesn't exist
-     */
-    public function render()
-    {
-        return static::renderStatic(
-            $this->arguments,
-            $this->buildRenderChildrenClosure(),
-            $this->renderingContext
-        );
-    }
-
     /**
      * Return array element by key.
      *
diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Uri/ActionViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Uri/ActionViewHelper.php
index 85101d4aa53d..571b2f8e3c8b 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Uri/ActionViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Uri/ActionViewHelper.php
@@ -14,6 +14,9 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Uri;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
+
 /**
  * A view helper for creating URIs to extbase actions.
  *
@@ -29,6 +32,8 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Uri;
  */
 class ActionViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
 {
+    use CompileWithRenderStatic;
+
     /**
      * Initialize arguments
      *
@@ -57,30 +62,32 @@ class ActionViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelp
     }
 
     /**
-     * @return string Rendered link
+     * @param array $arguments
+     * @param \Closure $renderChildrenClosure
+     * @param RenderingContextInterface $renderingContext
+     * @return string
      */
-    public function render()
+    public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
     {
-        $pageUid = $this->arguments['pageUid'];
-        $pageType = $this->arguments['pageType'];
-        $noCache = $this->arguments['noCache'];
-        $noCacheHash = $this->arguments['noCacheHash'];
-        $section = $this->arguments['section'];
-        $format = $this->arguments['format'];
-        $linkAccessRestrictedPages = $this->arguments['linkAccessRestrictedPages'];
-        $additionalParams = $this->arguments['additionalParams'];
-        $absolute = $this->arguments['absolute'];
-        $addQueryString = $this->arguments['addQueryString'];
-        $argumentsToBeExcludedFromQueryString = $this->arguments['argumentsToBeExcludedFromQueryString'];
-        $addQueryStringMethod = $this->arguments['addQueryStringMethod'];
-        $action = $this->arguments['action'];
-        $arguments = $this->arguments['arguments'];
-        $controller = $this->arguments['controller'];
-        $extensionName = $this->arguments['extensionName'];
-        $pluginName = $this->arguments['pluginName'];
+        $pageUid = $arguments['pageUid'];
+        $pageType = $arguments['pageType'];
+        $noCache = $arguments['noCache'];
+        $noCacheHash = $arguments['noCacheHash'];
+        $section = $arguments['section'];
+        $format = $arguments['format'];
+        $linkAccessRestrictedPages = $arguments['linkAccessRestrictedPages'];
+        $additionalParams = $arguments['additionalParams'];
+        $absolute = $arguments['absolute'];
+        $addQueryString = $arguments['addQueryString'];
+        $argumentsToBeExcludedFromQueryString = $arguments['argumentsToBeExcludedFromQueryString'];
+        $addQueryStringMethod = $arguments['addQueryStringMethod'];
+        $action = $arguments['action'];
+        $arguments = $arguments['arguments'];
+        $controller = $arguments['controller'];
+        $extensionName = $arguments['extensionName'];
+        $pluginName = $arguments['pluginName'];
 
-        $uriBuilder = $this->controllerContext->getUriBuilder();
-        $uri = $uriBuilder
+        $uri = $renderingContext->getControllerContext()->getUriBuilder()
             ->reset()
             ->setTargetPageUid($pageUid)
             ->setTargetPageType($pageType)
-- 
GitLab