made cachable edlp_productions home

This commit is contained in:
Bachir Soussi Chiadmi
2018-04-03 22:32:17 +02:00
parent 71eec82126
commit 6aa244cf17
@@ -4,8 +4,10 @@ namespace Drupal\edlp_productions\Controller;
use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Controller\ControllerBase;
use Drupal\menu_link_content\Entity\MenuLinkContent; 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 { class ProductionsController extends ControllerBase {
@@ -80,26 +82,40 @@ class ProductionsController extends ControllerBase {
*/ */
public function productionsjson() { public function productionsjson() {
$response = new JsonResponse();
$renderable = $this->toRenderable(); $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 // add menu production block
$block = $this->getProductionBlock(); // not used anymore as production block is always present (but not visible)
$block_render = \Drupal::entityTypeManager() // $block = $this->getProductionBlock();
->getViewBuilder('block') // $block_render = \Drupal::entityTypeManager()
->view($block); // ->getViewBuilder('block')
// ->view($block);
$data = [
$response->setData([
'test'=>'hello',
'rendered'=> $rendered, 'rendered'=> $rendered,
'block' => array( // 'block' => array(
'rendered'=> \Drupal::service('renderer')->renderRoot($block_render), // 'rendered'=> \Drupal::service('renderer')->renderRoot($block_render),
'region'=> str_replace('_', '-', $block->getRegion()), // 'region'=> str_replace('_', '-', $block->getRegion()),
'id'=> preg_replace('/^[^:]+:(.+)$/', 'block-$1', $block->getPluginId()) // '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; return $response;
} }