|
@@ -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();
|
|
|
|
- $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,
|
|
'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;
|
|
return $response;
|
|
}
|
|
}
|