I need to display a custom block on my homepage. This custom block retrieves some data that are not managed by Drupal. Since no event will happen in Drupal to say that those data have changed, the max-age cache property seems the way to go, and it's OK for me. The block appears exactly as expected, but the problem is thst the cache for this block seems to never expire. Actually, the block is never refreshed.
After researching, I found Setting cache max-age to 0 has no effect on Block built using BlockBase? that explains max-age cache property doesn't work as expected for anonymous requests. After adding the mentioned trigger, everything seemed to be all-right on my development environment.
Once on the production environment, it's the same as before: The block is never refreshed. Talking to the hosting provider, I was told that Varnish is used to cache the whole page, and I should use an ESI (Edge Side Include) to render this block with its own cache logic managed by Varnish.
I don't really know how to implement it in a clean way in Drupal. My first idea is to use a controller, render the block markup, and return in a response, forcing the needed cache-control header. This is the code I thought of for such controller.
$block_manager = \Drupal::service('plugin.manager.block'); $plugin_block = $block_manager->createInstance('my_block_id'); $buildedBlock = $plugin_block->build(); $renderedBlock = \Drupal::service ('renderer')->render ($buildedBlock); $response = new Response( $renderedBlock, Response::HTTP_OK, array('content-type' => 'text/html') ); $response->setSharedMaxAge(60); return $response;
I feel it is a totally unclean way to do this. Does anybody a better approach to propose? Would my code work?