Добавляем в page cache зависимость от значения cookie

Модуль page_cache использует http_middleware, чтобы зацепиться за объект request и произвести кеширование страницы. Работает он для анонимных пользователей. Хотелось бы расширить его возможности и получить больше управления над кешированием.

Рассмотрим как переопределить зацепку page_cache, и изменить идентификатор cache_id (cid), который генерируется для страниц. Мы добавим зависимость от названия города, которое пользователь передаёт как cookie с именем city.

Чтобы до конца было ясно, что мы меняем, приведу пример записей из таблицы cache_page:

CID формируется как сумма схемы, хоста и uri. А также добавляется формат (html, json и т.п.). При этом в В Drupal 11 значение формата всегда устанавливается как NULL. Не знаю с чем это связано, нам это не мешает.

Посмотрим на определение http_middleware в page_cache (page_cache.services.yml)

Мы заменим здесь параметр class. Вместо него установим собственный класс (расширение данного), где переопределим функцию формирования cid.

Переопределение сервиса в Drupal

Так как под капотом у нас Symphony, то предполагается несколько возможных путей для переопределения. Я остановился на варианте с реализацией интерфейса ServiceModifierInterface.

Нам нужно создать файл /my_module/src/MyModuleServiceProvider.php, где реализуется указанный интерфейс. Также требуется реализовать ServiceProviderInterface, который требуется для всех сервисов. Но мы немного упростим задачу, и будем расширять класс ServiceProviderBase, который частично решает нашу задачу, и нам остаётся написать только один метод — alter.

Тут мы проверяем наличие сервиса в контейнере друпал, и если он есть, то подменяем определение класса на наше собственное.

Переопределение генерации Cache ID

Теперь можно реализовать расширение класса PageCache.
/my_module/src/StackMiddleware/CookiesPageCache.php

Результатом станет изменение cid, и мы получим разные кеши для разных значений переменной, переданной как cookie.

Этот механизм открывает много возможностей для развития идей заложенных в page_cache.

Написать комментарий

 

Комментарии к «Добавляем в page cache зависимость от значения cookie»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: