Как предотвратить кэширование формы для анонимных пользователей?


У меня есть форма, предварительно заполненная информацией, относящейся к информации о сеансе анонимного пользователя. Однако по умолчанию форма кэшируется для всех анонимных пользователей.
"Внутренний динамический кэш страниц" включен, "Внутренний кэш страниц" - нет.

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

Author: kiamlaluno, 2016-08-15

4 answers

Для обновления:

Чтобы вообще запретить кэширование формы, вы можете включить в свою форму следующий ключ #cache:

$form['#cache'] = ['max-age' => 0];
 12
Author: BrianV, 2016-09-15 12:37:57

В вашем файле mymodule.module, расположенном в корневом каталоге вашего модуля:

/**
 * Workaround to prevent form caching for anonymous users.
 */
function mymodule_form_myregistration_form_alter() {
    \Drupal::service('page_cache_kill_switch')->trigger();
}

/**
 * Workaround to prevent form caching for anonymous users.
 */
function mymodule_form_mylogin_form_alter() {
    \Drupal::service('page_cache_kill_switch')->trigger();
}

Для этого используется изменение формы Drupal 8

 4
Author: JorgeeFG, 2018-10-18 20:08:47

Правильный способ сделать это с помощью:

$form['#cache']['contexts'][] = 'session';

На каком-то этапе между версиями Drupal max-age перестал работать

 2
Author: Colin Shipton, 2019-03-25 11:45:03

Некоторые формы, созданные с помощью FAPI Drupal 8(.7.8), выходят из строя при кэшировании на стороне сервера с использованием кэша Drupal 8 и загружаются анонимным пользователем.

Если вы очистите кэш на стороне сервера ($ drush cr), анонимный пользователь сможет успешно загрузить форму; при обновлении она аварийно завершает работу после кэширования на стороне сервера и перезагрузки пользователем.

В этом случае ответ Брианва ($form['#cache'] = ['max-age' => 0];) решает проблему на Drupal 8.7.8.

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

Могут возникнуть разные проблемы с прямой формой FAPI по сравнению с веб-формой, например, с формой расширения CiviCRM, и предоставление подробных сведений поможет людям намного больше, чем просто сказать "ну, этот код сработал для моей ситуации" без описания ситуации в подробно.

Также важно указать точную минорную версию Drupal, на которой вы находитесь.

Трассировка стека, которую создавала моя ситуация, была (отформатирована для удобства чтения):

TypeError: Argument 1 passed to Drupal\\Core\\Routing\\RequestContext::fromRequest() must be an instance of Symfony\\Component\\HttpFoundation\\Request, null given, called in DRUPAL_ROOT/core/lib/Drupal/Core/Routing/RequestContext.php on line 31 in DRUPAL_ROOT/core/lib/Drupal/Core/Routing/RequestContext.php on line 37 
#0 DRUPAL_ROOT/core/lib/Drupal/Core/Routing/RequestContext.php(31): Drupal\\Core\\Routing\\RequestContext->fromRequest(NULL)
#1 [internal function]: Drupal\\Core\\Routing\\RequestContext->fromRequestStack(Object(Symfony\\Component\\HttpFoundation\\RequestStack))
#2 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(329): call_user_func_array(Array, Array)
#3 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(173): Drupal\\Component\\DependencyInjection\\Container->createService(Array, 'router.request_...')
#4 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(487): Drupal\\Component\\DependencyInjection\\Container->get('router.request_...', 3)
#5 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(326): Drupal\\Component\\DependencyInjection\\Container->resolveServicesAndParameters(Array)
#6 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(502): Drupal\\Component\\DependencyInjection\\Container->createService(Array, 'private__zpo0hT...')
#7 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\\Component\\DependencyInjection\\Container->resolveServicesAndParameters(Array)
#8 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(173): Drupal\\Component\\DependencyInjection\\Container->createService(Array, 'url_generator')
#9 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(487): Drupal\\Component\\DependencyInjection\\Container->get('url_generator', 1)
#10 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\\Component\\DependencyInjection\\Container->resolveServicesAndParameters(Array)
#11 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(173): Drupal\\Component\\DependencyInjection\\Container->createService(Array, 'link_generator')
#12 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(487): Drupal\\Component\\DependencyInjection\\Container->get('link_generator', 1)
#13 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\\Component\\DependencyInjection\\Container->resolveServicesAndParameters(Array)
#14 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(173): Drupal\\Component\\DependencyInjection\\Container->createService(Array, 'plugin.manager....')
#15 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(487): Drupal\\Component\\DependencyInjection\\Container->get('plugin.manager....', 1)
#16 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\\Component\\DependencyInjection\\Container->resolveServicesAndParameters(Array)
#17 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(173): Drupal\\Component\\DependencyInjection\\Container->createService(Array, 'geocoder')
#18 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(487): Drupal\\Component\\DependencyInjection\\Container->get('geocoder', 1)
#19 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\\Component\\DependencyInjection\\Container->resolveServicesAndParameters(Array)
#20 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(173): Drupal\\Component\\DependencyInjection\\Container->createService(Array, 'nfb.address_ada...')
#21 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(487): Drupal\\Component\\DependencyInjection\\Container->get('nfb.address_ada...', 1)
#22 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\\Component\\DependencyInjection\\Container->resolveServicesAndParameters(Array)
#23 DRUPAL_ROOT/core/lib/Drupal/Component/DependencyInjection/Container.php(173): Drupal\\Component\\DependencyInjection\\Container->createService(Array, 'nfb_contact_inf...')
#24 DRUPAL_ROOT/core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php(80): Drupal\\Component\\DependencyInjection\\Container->get('nfb_contact_inf...')
#25 [internal function]: Drupal\\Core\\Form\\FormBase->__wakeup()
#26 DRUPAL_ROOT/core/lib/Drupal/Core/Cache/DatabaseBackend.php(167): unserialize('O:31:"Drupal\\\\Co...')
#27 DRUPAL_ROOT/core/lib/Drupal/Core/Cache/DatabaseBackend.php(122): Drupal\\Core\\Cache\\DatabaseBackend->prepareItem(Object(stdClass), false)
#28 DRUPAL_ROOT/core/lib/Drupal/Core/Cache/DatabaseBackend.php(92): Drupal\\Core\\Cache\\DatabaseBackend->getMultiple(Array, false)
#29 DRUPAL_ROOT/core/modules/page_cache/src/StackMiddleware/PageCache.php(306): Drupal\\Core\\Cache\\DatabaseBackend->get('https://dev.nfb...', false)
#30 DRUPAL_ROOT/core/modules/page_cache/src/StackMiddleware/PageCache.php(124): Drupal\\page_cache\\StackMiddleware\\PageCache->get(Object(Symfony\\Component\\HttpFoundation\\Request))
#31 DRUPAL_ROOT/core/modules/page_cache/src/StackMiddleware/PageCache.php(82): Drupal\\page_cache\\StackMiddleware\\PageCache->lookup(Object(Symfony\\Component\\HttpFoundation\\Request), 1, true)
#32 DRUPAL_ROOT/core/modules/ban/src/BanMiddleware.php(50): Drupal\\page_cache\\StackMiddleware\\PageCache->handle(Object(Symfony\\Component\\HttpFoundation\\Request), 1, true)
#33 DRUPAL_ROOT/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(47): Drupal\\ban\\BanMiddleware->handle(Object(Symfony\\Component\\HttpFoundation\\Request), 1, true)
#34 DRUPAL_ROOT/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(52): Drupal\\Core\\StackMiddleware\\ReverseProxyMiddleware->handle(Object(Symfony\\Component\\HttpFoundation\\Request), 1, true)
#35 DRUPAL_ROOT../vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\\Core\\StackMiddleware\\NegotiationMiddleware->handle(Object(Symfony\\Component\\HttpFoundation\\Request), 1, true)
#36 DRUPAL_ROOT/core/lib/Drupal/Core/DrupalKernel.php(693): Stack\\StackedHttpKernel->handle(Object(Symfony\\Component\\HttpFoundation\\Request), 1, true)
#37 DRUPAL_ROOT/index.php(19): Drupal\\Core\\DrupalKernel->handle(Object(Symfony\\Component\\HttpFoundation\\Request))
#38 {main}
 0
Author: Neil Davis, 2019-12-05 20:22:12