xandeadx.ru Блог музицирующего веб-девелопера

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

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

Комментарии RSS

Стоит отметить что оно также будет работать с включенным Internal Page Cache при наличии активной сессии у анонима (потому что IPC отключится для такого юзера).

Если нужно сохранить IPC и чтобы лейзи билдер работал, для этого можно написать Placeholder Strategy и обойти все ограничения IPC, например, чтобы можно было некоторые лейзи билдеры вызывать через AJAX.

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

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

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

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

Есть даже настройки, по котоырм определяется когда автоматически будут создаваться плейсхолдеры: https://github.com/drupal/drupal/blob/9.2.x/sites/default/default.servic...

Одним словом - магия :)

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании