Пример плагина блока, выводящий текущее время. Блок будет закэширован один раз, но контент при этом будет всегда актуальный (за исключением случая, когда включён модуль Internal Page Cache и страницу открыл аноним без сессии).
// src/Plugin/Block/CurrentDateBlock.php
namespace Drupal\mymodule\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Security\TrustedCallbackInterface;
/**
* @Block(
* id = "current_date",
* admin_label = @Translation("Current date"),
* category = @Translation("Custom"),
* )
*/
class CurrentDateBlock extends BlockBase implements TrustedCallbackInterface {
/**
* {@inheritDoc}
*/
public function build(): array {
$build['content'] = [
'#lazy_builder' => [
'\Drupal\mymodule\Plugin\Block\CurrentDateBlock::lazyBuilder',
[]
],
'#create_placeholder' => TRUE,
];
return $build;
}
/**
* Lazy builder callback.
*/
public static function lazyBuilder(): array {
return ['#markup' => date('r')];
}
/**
* {@inheritDoc}
*/
public static function trustedCallbacks(): array {
return ['lazyBuilder'];
}
}
Написанное актуально для
Drupal 8+
Комментарии
Стоит отметить что оно также будет работать с включенным Internal Page Cache при наличии активной сессии у анонима (потому что IPC отключится для такого юзера).
Если нужно сохранить IPC и чтобы лейзи билдер работал, для этого можно написать Placeholder Strategy и обойти все ограничения IPC, например, чтобы можно было некоторые лейзи билдеры вызывать через AJAX.
Не вижу практического смысла в этом коде. Содержимое блока и так строится в лейзи билдере, просто добавьте:
и для блока так же само будет сгенерирован плейсхолдер.
Да, будет некоторый выигрыш в том, что для кода в статье не будет выполняться эта часть. Но как по мне игра не стоит свеч.
Да, вы правы. Проверил и выяснил, что если блоку добавить max-age=0, то вместо вывода создаётся плейсхолдер. Я всегда думал, что плэйсхолдеры не создаются никогда и lazy build там нужен только для работы big pipe. Либо что-то переписали, либо когда я разбирался с ленивым билдом не обратил на это внимание. Спасибо за коммент.
Есть даже настройки, по котоырм определяется когда автоматически будут создаваться плейсхолдеры: https://github.com/drupal/drupal/blob/9.2.x/sites/default/default.servi…
Одним словом - магия :)
Добавить комментарий