diff --git a/core/modules/link/src/LinkServiceProvider.php b/core/modules/link/src/LinkServiceProvider.php index e830f2e..eef015d 100644 --- a/core/modules/link/src/LinkServiceProvider.php +++ b/core/modules/link/src/LinkServiceProvider.php @@ -19,6 +19,17 @@ class LinkServiceProvider implements ServiceProviderInterface { */ public function register(ContainerBuilder $container) { $modules = $container->getParameter('container.modules'); + if (isset($modules['serialization'])) { + // Add a generic normalizer service for LinkItem fields. + $service_definition = new Definition(LinkItemNormalizer::class, [ + new Reference('entity_type.manager'), + new Reference('entity.repository'), + ]); + // The priority must be higher than that of + // serializer.normalizer.complex_data in serialization.services.yml. + $service_definition->addTag('normalizer', array('priority' => 10)); + $container->setDefinition('link.normalizer.link_item', $service_definition); + } if (isset($modules['hal'])) { // Add a hal normalizer service for LinkItem fields. $service_definition = new Definition(HalLinkItemNormalizer::class, [ @@ -31,16 +42,6 @@ public function register(ContainerBuilder $container) { $service_definition->addTag('normalizer', array('priority' => 40)); $container->setDefinition('link.normalizer.link_item.hal', $service_definition); } - if (isset($modules['serialization'])) { - // Add a generic normalizer service for LinkItem fields. - $service_definition = new Definition(LinkItemNormalizer::class, [ - new Reference('entity_type.manager'), - ]); - // The priority must be higher than that of - // serializer.normalizer.complex_data in serialization.services.yml. - $service_definition->addTag('normalizer', array('priority' => 10)); - $container->setDefinition('link.normalizer.link_item', $service_definition); - } } } diff --git a/core/modules/link/tests/src/Kernel/Normalizer/LinkItemNormalizerTest.php b/core/modules/link/tests/src/Kernel/Normalizer/LinkItemNormalizerTest.php new file mode 100644 index 0000000..375e89b --- /dev/null +++ b/core/modules/link/tests/src/Kernel/Normalizer/LinkItemNormalizerTest.php @@ -0,0 +1,74 @@ +serializer = \Drupal::service('serializer'); + $this->installEntitySchema('entity_test'); + $this->installEntitySchema('user'); + + FieldStorageConfig::create([ + 'entity_type' => 'entity_test', + 'field_name' => 'field_link', + 'type' => 'link', + ])->save(); + + FieldConfig::create([ + 'entity_type' => 'entity_test', + 'field_name' => 'field_link', + 'bundle' => 'entity_test', + ])->save(); + } + + /** + * Tests the normalizing and denormalizing of Link field values on entities. + */ + public function testNormalizeDenormalize() { + $linked_entity = EntityTest::create(); + $linked_entity->save(); + $entity = EntityTest::create(['field_link' => 'entity:entity_test/' . $linked_entity->id()]); + $entity->save(); + + $data = $this->serializer->normalize($entity, 'json'); + $this->assertEquals($data['field_link'][0]['target_uuid'], $linked_entity->uuid()); + + $data['field_link'][0]['uri'] = 'entity:entity_test/2'; + + /** @var \Drupal\entity_test\Entity\EntityTest $denormalized_entity */ + $denormalized_entity = $this->serializer->denormalize($data, EntityTest::class, 'json'); + /** @var \Drupal\link\Plugin\Field\FieldType\LinkItem $linkItem */ + $linkItem = $denormalized_entity->field_link[0]; + + $this->assertEquals($linkItem->getUrl(), $entity->field_link[0]->getUrl()); + } + +} diff --git a/core/modules/menu_link_content/src/MenuLinkContentServiceProvider.php b/core/modules/menu_link_content/src/MenuLinkContentServiceProvider.php index 66aabfd..e7cb42f 100644 --- a/core/modules/menu_link_content/src/MenuLinkContentServiceProvider.php +++ b/core/modules/menu_link_content/src/MenuLinkContentServiceProvider.php @@ -19,6 +19,16 @@ class MenuLinkContentServiceProvider implements ServiceModifierInterface { */ public function alter(ContainerBuilder $container) { $modules = $container->getParameter('container.modules'); + if (isset($modules['serialization'])) { + // Add a generic normalizer service for menu-link-content entities. + $service_definition = new Definition(MenuLinkContentNormalizer::class, [ + new Reference('entity.manager'), + ]); + // The priority must be higher than that of + // serializer.normalizer.content_entity in serialization.services.yml. + $service_definition->addTag('normalizer', array('priority' => 10)); + $container->setDefinition('menu_link_content.normalizer.menu_link_content', $service_definition); + } if (isset($modules['hal'])) { // Add a hal normalizer service for menu-link-content entities. $service_definition = new Definition(HalMenuLinkContentNormalizer::class, [ @@ -31,16 +41,6 @@ public function alter(ContainerBuilder $container) { $service_definition->addTag('normalizer', array('priority' => 40)); $container->setDefinition('menu_link_content.normalizer.menu_link_content.hal', $service_definition); } - if (isset($modules['serialization'])) { - // Add a generic normalizer service for menu-link-content entities. - $service_definition = new Definition(MenuLinkContentNormalizer::class, [ - new Reference('entity.manager'), - ]); - // The priority must be higher than that of - // serializer.normalizer.content_entity in serialization.services.yml. - $service_definition->addTag('normalizer', array('priority' => 10)); - $container->setDefinition('menu_link_content.normalizer.menu_link_content', $service_definition); - } } }