Блокировать кэширование, не работающее для анонимных пользователей, несмотря на настройку контекстов кэша


У меня есть плагин блокировки, который отображает различное динамическое содержимое в зависимости от того, вошли вы в систему или нет. Я попытался включить это, установив параметр максимального возраста в атрибуте #cache моего массива визуализации равным 0, например

    if ($user->hasRole('anonymous')) {
            if ($loginrequired) {
                $content = [
                    '#markup' => '<p> Login required. <a href="/user/login">Click Here to Login</a></p>',
                ];
                return $content;
            }
    }
    $content = [
        'header'   => [
            '#markup' => $header_text,
        ],
        '#cache'   => [
            'max-age' => 0,
        ],
        $webform,
    ];
    return $content;

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

После проведения некоторых исследований кажется, что drupal игнорирует максимальный кэш для анонимных посетителей, и, согласно этой странице, потребуются контексты кэша

Отключите кэш форм или заблокируйте кэш для анонимных пользователей?

Поэтому я изменил свой код, чтобы отразить это

        '#cache'    => [
            'max-age'  => 0,
            'contexts' => ['user.roles']
        ],

Я использовал user.роли, так как содержимое зависело от того, вошел пользователь в систему или нет. Это не возымело никакого эффекта. Затем я попробовал.

        '#cache'    => [
            'max-age'  => 0,
            'contexts' => ['user.roles:anonymous']
        ],

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

Примечание: Я не хочу отключать кэширование по всему сайту. Я хотел бы иметь возможность отключать кэширование от плагина к плагину.

ОБНОВЛЕНИЕ: Глядя на примеры, я также пробовал

   '#cache' => [
            'max-age'  => 0,
            'contexts' => ['url.path', 'url.query_args']
    ],

Но это тоже не сработало.

Author: Community, 2017-03-24

1 answers

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

Я решил проблему, изменив свой код на

if ($user->hasRole('anonymous')) {
        if ($loginrequired) {
            $content = [
                '#markup' => '<p> Login required. <a href="/user/login">Click Here to Login</a></p>',
                '#cache'   => [
                     'max-age' => 0,
                     'contexts' => ['url.path']
                 ],
            ];
            return $content;
        }
}
$content = [
    'header'   => [
        '#markup' => $header_text,
    ],
    '#cache'   => [
        'max-age' => 0,
        'contexts' => ['url.path']
    ],
    $webform,
];
return $content;
 0
Author: Matt, 2017-03-24 19:02:59