.../src/EventSubscriber/DynamicPageCacheSubscriber.php | 4 ++-- .../src/Tests/DynamicPageCacheIntegrationTest.php | 6 ++++++ .../dynamic_page_cache_test.routing.yml | 7 +++++++ .../src/DynamicPageCacheTestController.php | 14 ++++++++++++-- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php b/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php index 17c2f33..ec0b716 100644 --- a/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php +++ b/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php @@ -234,9 +234,9 @@ public function onResponse(FilterResponseEvent $event) { // If #cache was not set, complain. // @see ::onViewRenderArray() - // If #cache is not set, complain. if ($request->attributes->get(self::ATTRIBUTE_CONTROLLER_RESULT_RENDER_ARRAY_HAS_CACHEABILITY) === FALSE) { - throw new \LogicException('The controller returned a render array without cacheability metadata. See https://www.drupal.org/developing/api/8/render/arrays/cacheability.'); + trigger_error('The controller for the route \'' . $request->attributes->get('_route') . '\' returned a render array without cacheability metadata. See https://www.drupal.org/developing/api/8/render/arrays/cacheability.', E_USER_ERROR); + return; } // Embed the response object in a render array so that RenderCache is able diff --git a/core/modules/dynamic_page_cache/src/Tests/DynamicPageCacheIntegrationTest.php b/core/modules/dynamic_page_cache/src/Tests/DynamicPageCacheIntegrationTest.php index 5c174a8..31c1636 100644 --- a/core/modules/dynamic_page_cache/src/Tests/DynamicPageCacheIntegrationTest.php +++ b/core/modules/dynamic_page_cache/src/Tests/DynamicPageCacheIntegrationTest.php @@ -127,6 +127,12 @@ public function testDynamicPageCache() { // Cache. $this->drupalGet('dynamic-page-cache-test/html/uncacheable/tags'); $this->assertEqual('MISS', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'By default, Drupal has no auto-placeholdering cache tags.'); + + // Finally, controllers returning render arrays without a top-level #cache + // trigger an exception urging the developer to add cacheability metadata. + $this->drupalGet(Url::fromRoute('dynamic_page_cache_test.html_without_cacheability')); + $this->assertResponse(200); + $this->assertRaw("The controller for the route 'dynamic_page_cache_test.html_without_cacheability' returned a render array without cacheability metadata. See https://www.drupal.org/developing/api/8/render/arrays/cacheability."); } } diff --git a/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/dynamic_page_cache_test.routing.yml b/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/dynamic_page_cache_test.routing.yml index 77125b6..1b06b47 100644 --- a/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/dynamic_page_cache_test.routing.yml +++ b/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/dynamic_page_cache_test.routing.yml @@ -73,3 +73,10 @@ dynamic_page_cache_test.html.uncacheable.tags: _controller: '\Drupal\dynamic_page_cache_test\DynamicPageCacheTestController::htmlUncacheableTags' requirements: _access: 'TRUE' + +dynamic_page_cache_test.html_without_cacheability: + path: '/dynamic-page-cache-test/html-without-cacheability' + defaults: + _controller: '\Drupal\dynamic_page_cache_test\DynamicPageCacheTestController::htmlWithoutCacheability' + requirements: + _access: 'TRUE' diff --git a/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/src/DynamicPageCacheTestController.php b/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/src/DynamicPageCacheTestController.php index b11984e..9550a45 100644 --- a/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/src/DynamicPageCacheTestController.php +++ b/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/src/DynamicPageCacheTestController.php @@ -45,12 +45,12 @@ public function cacheableResponse() { } /** - * A route returning a render array (without cache contexts, so cacheable). + * A route returning a render array without #cache. * * @return array * A render array. */ - public function html() { + public function htmlWithoutCacheability() { return [ 'content' => [ '#markup' => 'Hello world.', @@ -59,6 +59,16 @@ public function html() { } /** + * A route returning a render array (without cache contexts, so cacheable). + * + * @return array + * A render array. + */ + public function html() { + return $this->htmlWithoutCacheability() + ['#cache' => []]; + } + + /** * A route returning a render array (with cache contexts, so cacheable). * * @param \Symfony\Component\HttpFoundation\Request $request