.../Core/EventSubscriber/EarlyRenderingControllerWrapper.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapper.php b/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapper.php index a39c261..125ba49 100644 --- a/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapper.php +++ b/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapper.php @@ -7,7 +7,9 @@ namespace Drupal\Core\EventSubscriber; +use Drupal\Core\Cache\CacheableDependencyInterface; use Drupal\Core\Controller\ControllerResolverInterface; +use Drupal\Core\Render\AttachmentsInterface; use Drupal\Core\Render\BubbleableMetadata; use Drupal\Core\Render\RenderContext; use Drupal\Core\Render\RendererInterface; @@ -115,7 +117,12 @@ public function onController(FilterControllerEvent $event) { ->merge($early_rendering_bubbleable_metadata) ->applyTo($response); } - else { + // If early rendering happened, yet a response object is returned, not a + // render array, and the response object cares about attachments or + // cacheability, then throw an exception: early rendering is not + // permitted in that case. It is the developer's responsibility to not + // use early rendering. + elseif ($response instanceof AttachmentsInterface || $response instanceof CacheableDependencyInterface) { throw new \LogicException(sprintf('Early rendering is not permitted for controllers returning anything else than render arrays. Response class: %s.', get_class($response))); } }