Drupal → Дружим Sape и Internal Page Cache (вставка динамического содержимого в закэшированную страницу)

08.04.2021

В официальной документации Sape написано, что при установке скрипта для вывода ссылок на Drupal сайте нужно отключить модуль Internal Page Cache. Это мягко говоря плохой совет, ибо модуль на порядок увеличивает скорость отдачи страниц анонимным пользователям. Сложность лишь в том, что повлиять на содержимое страницы, отдаваемое Internal Page Cache, можно только написав свой middleware. Приступаем:

1. Создаём модуль с именем sape_links:

vendor/bin/drush generate module

2. Включаем модуль:

vendor/bin/drush en sape_links

3. В модуле создаём файл src/SapeLinksMiddleware.php:

<?php

namespace Drupal\sape_links;

use Drupal\Component\Utility\Xss;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class SapeLinksMiddleware implements HttpKernelInterface {

  private HttpKernelInterface $httpKernel;

  /**
   * Constructor.
   */
  public function __construct(HttpKernelInterface $http_kernel) {
    $this->httpKernel = $http_kernel;
  }

  /**
   * {@inheritDoc}
   */
  public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE): Response {
    $response = $this->httpKernel->handle($request, $type, $catch);

    if (str_starts_with($response->headers->get('content-type', ''), 'text/html')) {
      $content = $response->getContent();
      $content = str_replace('<!-- SAPE LINKS -->', $this->getSapeLinks(), $content);
      $response->setContent($content);
    }

    return $response;
  }

  /**
   * Return Sape links.
   */
  protected function getSapeLinks(): string {
    define('_SAPE_USER', '...');
    require_once($_SERVER['DOCUMENT_ROOT'] . '/' . _SAPE_USER . '/sape.php');
    $sape = new \SAPE_client(['charset' => 'utf-8']);
    return $sape->return_links();
  }

}

В define('_SAPE_USER', '...'); прописываем свой идентификатор в Sape.

4. В модуле создаём файл sape_links.services.yml:

services:
  http_middleware.sape_links:
    class: Drupal\sape_links\SapeLinksMiddleware
    tags:
      - { name: http_middleware, priority: 201 } # Run before http_middleware.page_cache

5. В месте, где нужно вывести ссылки вставляем код <!-- SAPE LINKS --> (можно добавить в блок, либо прямо в page.html.twig).

6. Сбрасываем кэш:

vendor/bin/drush cache-rebuild

Profit.

Код в виде модуля (надо только прописать свой sape id)
Подробнее про Middleware

Написанное актуально для
Drupal 9
Похожие записи

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