diff --git a/core/modules/jsonapi/src/ResourceType/ResourceTypeBuildEvent.php b/core/modules/jsonapi/src/ResourceType/ResourceTypeBuildEvent.php index fdc34cd5538f40f2ddd526c2fdfa7d842556e808..9090a706af7830e0e8124af2ca2b2bedb4a05902 100644 --- a/core/modules/jsonapi/src/ResourceType/ResourceTypeBuildEvent.php +++ b/core/modules/jsonapi/src/ResourceType/ResourceTypeBuildEvent.php @@ -151,4 +151,19 @@ public function disableField(ResourceTypeField $field) { } } + /** + * Enables the given field on the resource type to be built. + * + * @param \Drupal\jsonapi\ResourceType\ResourceTypeField $field + * The field for which to set a public name. + */ + public function enableField(ResourceTypeField $field): void { + foreach ($this->fields as $index => $value) { + if ($field === $value) { + $this->fields[$index] = $value->enabled(); + return; + } + } + } + } diff --git a/core/modules/jsonapi/src/ResourceType/ResourceTypeField.php b/core/modules/jsonapi/src/ResourceType/ResourceTypeField.php index c6a1922f8e85b5c4c857e5dc9277a6a5996b77c8..6f8d2ec8c8c9bbbe8e59cfd9fb60f72368854cd9 100644 --- a/core/modules/jsonapi/src/ResourceType/ResourceTypeField.php +++ b/core/modules/jsonapi/src/ResourceType/ResourceTypeField.php @@ -105,6 +105,16 @@ public function disabled() { return new static($this->internalName, $this->publicName, FALSE, $this->hasOne); } + /** + * Gets a new instance of the field that is enabled. + * + * @return static + * A new instance of the field that is enabled. + */ + public function enabled(): static { + return new static($this->internalName, $this->publicName, TRUE, $this->hasOne); + } + /** * Whether the field is enabled. * diff --git a/core/modules/jsonapi/tests/modules/jsonapi_test_resource_type_building/jsonapi_test_resource_type_building.services.yml b/core/modules/jsonapi/tests/modules/jsonapi_test_resource_type_building/jsonapi_test_resource_type_building.services.yml index 101af96e5d67eaf4b30a4748e4bd85cc31d6f404..7f14c3c07f71993f6a8d0a59c7cdae6392e53e63 100644 --- a/core/modules/jsonapi/tests/modules/jsonapi_test_resource_type_building/jsonapi_test_resource_type_building.services.yml +++ b/core/modules/jsonapi/tests/modules/jsonapi_test_resource_type_building/jsonapi_test_resource_type_building.services.yml @@ -3,3 +3,9 @@ services: autoconfigure: true jsonapi_test_resource_type_building.build_subscriber: class: Drupal\jsonapi_test_resource_type_building\EventSubscriber\ResourceTypeBuildEventSubscriber + tags: + - { name: event_subscriber, priority: 1000 } + jsonapi_test_resource_type_building.late_build_subscriber: + class: Drupal\jsonapi_test_resource_type_building\EventSubscriber\LateResourceTypeBuildEventSubscriber + tags: + - { name: event_subscriber, priority: 999 } diff --git a/core/modules/jsonapi/tests/modules/jsonapi_test_resource_type_building/src/EventSubscriber/LateResourceTypeBuildEventSubscriber.php b/core/modules/jsonapi/tests/modules/jsonapi_test_resource_type_building/src/EventSubscriber/LateResourceTypeBuildEventSubscriber.php new file mode 100644 index 0000000000000000000000000000000000000000..72094cfc282ff9e3ebdd364737b156ce4c97e877 --- /dev/null +++ b/core/modules/jsonapi/tests/modules/jsonapi_test_resource_type_building/src/EventSubscriber/LateResourceTypeBuildEventSubscriber.php @@ -0,0 +1,47 @@ +<?php + +declare(strict_types=1); + +namespace Drupal\jsonapi_test_resource_type_building\EventSubscriber; + +use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvents; +use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +/** + * Event subscriber which tests enabling disabled resource type fields. + * + * @internal + */ +class LateResourceTypeBuildEventSubscriber implements EventSubscriberInterface { + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents(): array { + return [ + ResourceTypeBuildEvents::BUILD => [ + ['enableResourceTypeFields'], + ], + ]; + } + + /** + * Disables any resource type fields that have been aliased by a test. + * + * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event + * The build event. + */ + public function enableResourceTypeFields(ResourceTypeBuildEvent $event): void { + $aliases = \Drupal::state()->get('jsonapi_test_resource_type_builder.enabled_resource_type_fields', []); + $resource_type_name = $event->getResourceTypeName(); + if (in_array($resource_type_name, array_keys($aliases), TRUE)) { + foreach ($event->getFields() as $field) { + if (isset($aliases[$resource_type_name][$field->getInternalName()]) && $aliases[$resource_type_name][$field->getInternalName()] === TRUE) { + $event->enableField($field); + } + } + } + } + +} diff --git a/core/modules/jsonapi/tests/src/Kernel/ResourceType/ResourceTypeRepositoryTest.php b/core/modules/jsonapi/tests/src/Kernel/ResourceType/ResourceTypeRepositoryTest.php index 499de8f421561c50f282f480a310fbd87a9d533b..59667701f5b0b2bb89d12bc01f455e4c960d7941 100644 --- a/core/modules/jsonapi/tests/src/Kernel/ResourceType/ResourceTypeRepositoryTest.php +++ b/core/modules/jsonapi/tests/src/Kernel/ResourceType/ResourceTypeRepositoryTest.php @@ -213,6 +213,40 @@ public function testResourceTypeFieldDisabling(): void { $this->assertTrue($this->resourceTypeRepository->getByTypeName('node--page')->isFieldEnabled('uid')); } + /** + * Tests that resource type fields can be re-enabled per resource type. + */ + public function testResourceTypeFieldEnabling(): void { + $this->assertTrue($this->resourceTypeRepository->getByTypeName('node--article')->isFieldEnabled('uid')); + $this->assertTrue($this->resourceTypeRepository->getByTypeName('node--page')->isFieldEnabled('uid')); + $disabled_resource_type_fields = [ + 'node--article' => [ + 'uid' => TRUE, + ], + 'node--page' => [ + 'uid' => TRUE, + ], + ]; + \Drupal::state()->set('jsonapi_test_resource_type_builder.disabled_resource_type_fields', $disabled_resource_type_fields); + Cache::invalidateTags(['jsonapi_resource_types']); + $this->assertFalse($this->resourceTypeRepository->getByTypeName('node--article')->isFieldEnabled('uid')); + $this->assertFalse($this->resourceTypeRepository->getByTypeName('node--page')->isFieldEnabled('uid')); + + $enabled_resource_type_fields = [ + 'node--article' => [ + 'uid' => TRUE, + ], + 'node--page' => [ + 'uid' => TRUE, + ], + ]; + \Drupal::state()->set('jsonapi_test_resource_type_builder.enabled_resource_type_fields', $enabled_resource_type_fields); + Cache::invalidateTags(['jsonapi_resource_types']); + $this->assertTrue($this->resourceTypeRepository->getByTypeName('node--article')->isFieldEnabled('uid')); + $this->assertTrue($this->resourceTypeRepository->getByTypeName('node--page')->isFieldEnabled('uid')); + + } + /** * Tests that resource types can be renamed. */