From 6aa244cf17ef6207dbf56f0043237b6c925dd2fb Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Tue, 3 Apr 2018 22:32:17 +0200 Subject: [PATCH] made cachable edlp_productions home --- .../src/Controller/ProductionsController.php | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/sites/all/modules/figli/edlp_productions/src/Controller/ProductionsController.php b/sites/all/modules/figli/edlp_productions/src/Controller/ProductionsController.php index e3efdb899..28052a6d3 100644 --- a/sites/all/modules/figli/edlp_productions/src/Controller/ProductionsController.php +++ b/sites/all/modules/figli/edlp_productions/src/Controller/ProductionsController.php @@ -4,8 +4,10 @@ namespace Drupal\edlp_productions\Controller; use Drupal\Core\Controller\ControllerBase; use Drupal\menu_link_content\Entity\MenuLinkContent; -use Symfony\Component\HttpFoundation\JsonResponse; - +// use Symfony\Component\HttpFoundation\JsonResponse; +use Drupal\Core\Cache\CacheableJsonResponse; +use Drupal\Core\Cache\CacheableMetadata; +use Drupal\core\render\RenderContext; class ProductionsController extends ControllerBase { @@ -80,26 +82,40 @@ class ProductionsController extends ControllerBase { */ public function productionsjson() { - $response = new JsonResponse(); $renderable = $this->toRenderable(); - $rendered = render($renderable); + // $rendered = render($renderable); + // We can't render directly the entity as it throw an exception with cachable data + // see http://blog.dcycle.com/blog/2018-01-24/caching-drupal-8-rest-resource/#the-dreaded-leaked-metadata-error + $rendered = \Drupal::service('renderer')->executeInRenderContext(new RenderContext(), function () use ($renderable) { + return render($renderable); + }); // add menu production block - $block = $this->getProductionBlock(); - $block_render = \Drupal::entityTypeManager() - ->getViewBuilder('block') - ->view($block); + // not used anymore as production block is always present (but not visible) + // $block = $this->getProductionBlock(); + // $block_render = \Drupal::entityTypeManager() + // ->getViewBuilder('block') + // ->view($block); - - $response->setData([ - 'test'=>'hello', + $data = [ 'rendered'=> $rendered, - 'block' => array( - 'rendered'=> \Drupal::service('renderer')->renderRoot($block_render), - 'region'=> str_replace('_', '-', $block->getRegion()), - 'id'=> preg_replace('/^[^:]+:(.+)$/', 'block-$1', $block->getPluginId()) - ) - ]); + // 'block' => array( + // 'rendered'=> \Drupal::service('renderer')->renderRoot($block_render), + // 'region'=> str_replace('_', '-', $block->getRegion()), + // 'id'=> preg_replace('/^[^:]+:(.+)$/', 'block-$1', $block->getPluginId()) + // ) + ]; + + $data['#cache'] = [ + 'max-age' => \Drupal\Core\Cache\Cache::PERMANENT, + 'tags' => ['edlp-productions-cache'] + ]; + + // $response = new JsonResponse(); + // $response->setData($data); + $response = new CacheableJsonResponse($data); + $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($data)); + $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($renderable)); return $response; }