Browse Source

made cachable edlp_productions home

Bachir Soussi Chiadmi 6 years ago
parent
commit
6aa244cf17

+ 33 - 17
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;
   }