Drupal → Плагин блока, генерящий динамический контент с помощью #lazy_builder

15.01.2021

Пример плагина блока, выводящий текущее время. Блок будет закэширован один раз, но контент при этом будет всегда актуальный (за исключением случая, когда включён модуль 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.

Гость
23.01.2021, 15:27

Не вижу практического смысла в этом коде. Содержимое блока и так строится в лейзи билдере, просто добавьте:

  /**
   * {@inheritDoc}
   */
  public function getCacheMaxAge() {
    return 0;
  }

и для блока так же само будет сгенерирован плейсхолдер.
Да, будет некоторый выигрыш в том, что для кода в статье не будет выполняться эта часть. Но как по мне игра не стоит свеч.

Да, вы правы. Проверил и выяснил, что если блоку добавить max-age=0, то вместо вывода создаётся плейсхолдер. Я всегда думал, что плэйсхолдеры не создаются никогда и lazy build там нужен только для работы big pipe. Либо что-то переписали, либо когда я разбирался с ленивым билдом не обратил на это внимание. Спасибо за коммент.

Добавить комментарий