Problem/Motivation
Under certain circumstances, it is relatively easy to cause cache polution for options_allowed_values's drupal_static.
Steps to reproduce
In custom entity:
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields = parent::baseFieldDefinitions($entity_type);
$fields['options_list'] = BaseFieldDefinition::create('list_string')
->setLabel(t('Options'))
->setSettings([
'allowed_values' => ['foo' => t('Foo'), 'bar' => t('Bar')],
]);
}
public static function bundleFieldDefinitions(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
if ($bundle === 'baz') {
$fields['options_list'] = clone $base_field_definitions['options_list'];
$fields['options_list']->setSettings([
'allowed_values' => ['baz' => t('Baz')],
]);
return $fields;
}
return [];
}
Then bulk insert a bunch of entities where some have a bundle of baz
and the rest are foobar
. Once the foobar
bundled entities are validated/saved, any attempts to perform entity validation on baz
bundle entities will fail because they are passing an option value of 'baz' and the previous list of ['foo', 'bar'] was already statically cached by drupal_static().
Proposed resolution
Add the target bundle to the cache keys.
Remaining tasks
Tests