diff --git a/core/core.services.yml b/core/core.services.yml index d1223e9..8173524 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -362,7 +362,7 @@ services: class: Drupal\Core\Form\FormErrorHandler form_cache: class: Drupal\Core\Form\FormCache - arguments: ['@app.root', '@keyvalue.expirable', '@module_handler', '@current_user', '@csrf_token', '@logger.channel.form', '@request_stack', '@page_cache_request_policy'] + arguments: ['@app.root', '@keyvalue.expirable', '@module_handler', '@current_user', '@config.factory', '@csrf_token', '@logger.channel.form', '@request_stack', '@page_cache_request_policy'] public: false # Private to form_builder keyvalue: class: Drupal\Core\KeyValueStore\KeyValueFactory diff --git a/core/lib/Drupal/Core/Form/FormCache.php b/core/lib/Drupal/Core/Form/FormCache.php index 13e5430..addc3d4 100644 --- a/core/lib/Drupal/Core/Form/FormCache.php +++ b/core/lib/Drupal/Core/Form/FormCache.php @@ -4,6 +4,8 @@ use Drupal\Component\Utility\Crypt; use Drupal\Core\Access\CsrfTokenGenerator; +use Drupal\Core\Config\ConfigFactory; +use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\KeyValueStore\KeyValueExpirableFactoryInterface; use Drupal\Core\PageCache\RequestPolicyInterface; @@ -19,6 +21,11 @@ class FormCache implements FormCacheInterface { /** + * The default lifetime of the form's cache is set to 6 hours. + */ + const CACHE_LIFETIME = 21600; + + /** * The factory for expirable key value stores used by form cache. * * @var \Drupal\Core\KeyValueStore\KeyValueExpirableFactoryInterface @@ -93,6 +100,8 @@ class FormCache implements FormCacheInterface { * The module handler. * @param \Drupal\Core\Session\AccountInterface $current_user * The current user. + * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory + * The configuration factory * @param \Drupal\Core\Access\CsrfTokenGenerator $csrf_token * The CSRF token generator. * @param \Psr\Log\LoggerInterface $logger @@ -102,11 +111,12 @@ class FormCache implements FormCacheInterface { * @param \Drupal\Core\PageCache\RequestPolicyInterface $request_policy * A policy rule determining the cacheability of a request. */ - public function __construct($root, KeyValueExpirableFactoryInterface $key_value_expirable_factory, ModuleHandlerInterface $module_handler, AccountInterface $current_user, CsrfTokenGenerator $csrf_token, LoggerInterface $logger, RequestStack $request_stack, RequestPolicyInterface $request_policy) { + public function __construct($root, KeyValueExpirableFactoryInterface $key_value_expirable_factory, ModuleHandlerInterface $module_handler, AccountInterface $current_user, ConfigFactoryInterface $configFactory, CsrfTokenGenerator $csrf_token, LoggerInterface $logger, RequestStack $request_stack, RequestPolicyInterface $request_policy) { $this->root = $root; $this->keyValueExpirableFactory = $key_value_expirable_factory; $this->moduleHandler = $module_handler; $this->currentUser = $current_user; + $this->configFactory = $configFactory; $this->logger = $logger; $this->csrfToken = $csrf_token; $this->requestStack = $request_stack; @@ -170,8 +180,13 @@ protected function loadCachedFormState($form_build_id, FormStateInterface $form_ * {@inheritdoc} */ public function setCache($form_build_id, $form, FormStateInterface $form_state) { - // 6 hours cache life time for forms should be plenty. - $expire = 21600; + $system_form = $this->configFactory->get('system.form'); + if (empty($system_form)) { + $expire = static::CACHE_LIFETIME; + } + else { + $expire = $system_form->get('cache_lifetime'); + } // Ensure that the form build_id embedded in the form structure is the same // as the one passed in as a parameter. This is an additional safety measure diff --git a/core/modules/system/config/install/system.form.yml b/core/modules/system/config/install/system.form.yml new file mode 100644 index 0000000..9e2e584 --- /dev/null +++ b/core/modules/system/config/install/system.form.yml @@ -0,0 +1 @@ +cache_lifetime: 21600 diff --git a/core/modules/system/config/schema/system.schema.yml b/core/modules/system/config/schema/system.schema.yml index e34d375..02129d1 100644 --- a/core/modules/system/config/schema/system.schema.yml +++ b/core/modules/system/config/schema/system.schema.yml @@ -123,6 +123,14 @@ system.diff: type: integer label: 'Number of trailing lines in a diff' +system.form: + type: config_object + label: 'Form settings' + mapping: + cache_lifetime: + type: integer + label: 'Form cache lifetime' + system.logging: type: config_object label: 'Logging settings' diff --git a/core/tests/Drupal/KernelTests/Core/Form/FormCacheTest.php b/core/tests/Drupal/KernelTests/Core/Form/FormCacheTest.php index fa86bee..238a25e 100644 --- a/core/tests/Drupal/KernelTests/Core/Form/FormCacheTest.php +++ b/core/tests/Drupal/KernelTests/Core/Form/FormCacheTest.php @@ -40,6 +40,7 @@ class FormCacheTest extends KernelTestBase { protected function setUp() { parent::setUp(); $this->installSchema('system', array('key_value_expire')); + $this->installConfig('system'); $this->formBuildId = $this->randomMachineName(); $this->form = array( diff --git a/core/tests/Drupal/Tests/Core/Form/FormCacheTest.php b/core/tests/Drupal/Tests/Core/Form/FormCacheTest.php index 8b2734d..3d360c0 100644 --- a/core/tests/Drupal/Tests/Core/Form/FormCacheTest.php +++ b/core/tests/Drupal/Tests/Core/Form/FormCacheTest.php @@ -34,6 +34,13 @@ class FormCacheTest extends UnitTestCase { protected $account; /** + * The config factory. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $configFactory; + + /** * The CSRF token generator. * * @var \Drupal\Core\Access\CsrfTokenGenerator|\PHPUnit_Framework_MockObject_MockObject @@ -110,6 +117,14 @@ protected function setUp() { ['form_state', $this->formStateCacheStore], ])); + $this->configFactory = $this->getConfigFactoryStub( + [ + 'system.form' => [ + 'cache_lifetime' => 21600 + ] + ] + ); + $this->csrfToken = $this->getMockBuilder('Drupal\Core\Access\CsrfTokenGenerator') ->disableOriginalConstructor() ->getMock(); @@ -119,7 +134,7 @@ protected function setUp() { $this->requestStack = $this->getMock('\Symfony\Component\HttpFoundation\RequestStack'); $this->requestPolicy = $this->getMock('\Drupal\Core\PageCache\RequestPolicyInterface'); - $this->formCache = new FormCache($this->root, $this->keyValueExpirableFactory, $this->moduleHandler, $this->account, $this->csrfToken, $this->logger, $this->requestStack, $this->requestPolicy); + $this->formCache = new FormCache($this->root, $this->keyValueExpirableFactory, $this->moduleHandler, $this->account, $this->configFactory, $this->csrfToken, $this->logger, $this->requestStack, $this->requestPolicy); } /**