Как использовать систему заполнителей рендеринга для cacheablejsonresponse?


У меня есть пользовательские контроллеры, которые предоставляют ответы CacheableJsonResponse. Эти ответы довольно сложно построить (пара секунд), поэтому я хочу построить их лучше. Я создаю эти ответы, получая объекты сущностей, нормализуя их содержимое - включая объекты, на которые ссылаются, - и помещая данные непосредственно в объект ответа.

Мои ответы JSON зависят от пользователя, проверяют доступ к роли и включают некоторый пользовательский контент (например, флаги). Я попытался поместить кэш контекст на пользователя url) на CacheableJsonResponse, но, с моей точки зрения, это не является жизнеспособным способом обработки кэша; это создало бы запись кэша для каждого пользователя и запроса URL и было бы неэффективным (кэш попадет только тогда, когда один и тот же запрос запрашивается дважды или более одним и тем же пользователем).

Стандартный рендерер Drupal, по-видимому, включает систему заполнителей, которая кэширует большую часть страницы с соответствующими тегами контекста+кэша, а небольшие части с высокий коэффициент мощности/недействительности, выведенный последним из системы кэширования (насколько я понимаю), а затем был бы полезен для моих нужд.

Как я могу легко воспроизвести ту же систему для своих контроллеров? Существует ли какой-либо стандартный механизм/шаблон?

Ссылка: https://www.drupal.org/docs/8/api/render-api/auto-placeholdering

Author: Dakwamine, 2019-02-02

1 answers

Единственный компромисс, который я нашел, - это реализовать пользовательские теги (для каждого пользователя) и поместить массив данных ответов в кэш, чтобы у меня был контроль над условиями кэшируемости на уровне контроллера. Я создаю метаданные кэшируемости (контекст + теги) с помощью сервиса, который регистрирует метаданные контента, который в настоящее время нормализован. И когда нормализация заканчивается, я объединяю метаданные с ответом и помещаю ответ в серверную часть кэша.

И когда контроллер вызывается снова, я пытаюсь получить кэшированный ответ и возвращает его, если он не признан недействительным.

Внутренний и динамический кэш страниц по-прежнему работает для других контроллеров (т.Е. стандартных отображаемых страниц) без удаления тегов высокой недействительности из файла services.yml.

Не стесняйтесь добавлять лучшие ответы, чем этот.

Протестировано на Drupal 8.6.7.

Примечание сбоку

Поскольку я использовал флаг, мне пришлось реализовать теги кэша пары: идентификатор пользователя+ идентификатор флага. Таким образом, мы не будем аннулировать кэши всех пользователей всякий раз, когда один пользователь помечает или отменяет блокировку содержимого. Это не отвечает на этот вопрос, но я подумал, что было бы полезно включить в ваши размышления для вашей собственной системы кэширования.

 0
Author: Dakwamine, 2019-03-11 09:44:51