diff --git a/core/modules/image/src/ImageServiceProvider.php b/core/modules/image/src/ImageServiceProvider.php index 9fd26cf..85e697d 100644 --- a/core/modules/image/src/ImageServiceProvider.php +++ b/core/modules/image/src/ImageServiceProvider.php @@ -4,6 +4,7 @@ use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\DependencyInjection\ServiceProviderInterface; +use Drupal\image\Normalizer\ImageItemHalNormalizer; use Drupal\image\Normalizer\ImageItemNormalizer; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; @@ -30,6 +31,21 @@ public function register(ContainerBuilder $container) { $service_definition->addTag('normalizer', ['priority' => 9]); $container->setDefinition('image.normalizer.image_item', $service_definition); } + if (isset($modules['hal'])) { + // Add an ImageItem normalizer. + $service_definition = new Definition(ImageItemHalNormalizer::class, [ + new Reference('rest.link_manager'), + new Reference('serializer.entity_resolver'), + new Reference('entity_type.manager'), + new Reference('renderer'), + ]); + // Priority should be higher than + // serializer.normalizer.entity_reference_item.hal which 10. + // Priority of 20 gives the ability to have other normalizers between this + // one and serializer.normalizer.entity_reference_item.hal. + $service_definition->addTag('normalizer', ['priority' => 20]); + $container->setDefinition('image.normalizer.hal.image_item', $service_definition); + } } } diff --git a/core/modules/image/src/Normalizer/ImageItemHalNormalizer.php b/core/modules/image/src/Normalizer/ImageItemHalNormalizer.php new file mode 100644 index 0000000..c3726b0 --- /dev/null +++ b/core/modules/image/src/Normalizer/ImageItemHalNormalizer.php @@ -0,0 +1,71 @@ +entityTypeManager = $entity_type_manager; + $this->renderer = $renderer; + } + + /** + * {@inheritdoc} + */ + public function normalize($object, $format = NULL, array $context = []) { + $data = parent::normalize($object, $format, $context); + if (!empty($data['_embedded'])) { + $field_key = array_keys($data['_embedded'])[0]; + $this->addImageStyles($object, $data['_embedded'][$field_key][0]); + } + return $data; + } + +} diff --git a/core/modules/image/src/Normalizer/ImageItemNormalizer.php b/core/modules/image/src/Normalizer/ImageItemNormalizer.php index 66efd07..60dbf55 100644 --- a/core/modules/image/src/Normalizer/ImageItemNormalizer.php +++ b/core/modules/image/src/Normalizer/ImageItemNormalizer.php @@ -5,8 +5,6 @@ use Drupal\Core\Cache\ConditionalCacheabilityMetadataBubblingTrait; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Render\RendererInterface; -use Drupal\file\Entity\File; -use Drupal\image\Entity\ImageStyle; use Drupal\image\Plugin\Field\FieldType\ImageItem; use Drupal\serialization\Normalizer\EntityReferenceFieldItemNormalizer; @@ -17,6 +15,8 @@ class ImageItemNormalizer extends EntityReferenceFieldItemNormalizer { use ConditionalCacheabilityMetadataBubblingTrait; + use ImageItemNormalizerTrait; + /** * The entity type manager. * @@ -52,27 +52,12 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Ren /** * {@inheritdoc} */ - public function normalize($object, $format = NULL, array $context = [] ) { + public function normalize($object, $format = NULL, array $context = []) { $data = parent::normalize($object, $format, $context); if (empty($data['target_id'])) { return $data; } - /** @var \Drupal\file\FileInterface $image */ - $image = $this->entityTypeManager->getStorage('file')->load($data['target_id']); - $uri = $image->getFileUri(); - /** @var \Drupal\image\ImageStyleInterface[] $styles */ - $styles = $this->entityTypeManager->getStorage('image_style')->loadMultiple(); - $data['image_styles'] = []; - foreach ($styles as $id => $style) { - $dimensions = ['width' => $data['width'], 'height' => $data['height']]; - $style->transformDimensions($dimensions, $uri); - $data['image_styles'][$id] = [ - 'url' => file_url_transform_relative($style->buildUrl($uri)), - 'height' => empty($dimensions['height']) ? NULL : $dimensions['height'], - 'width' => empty($dimensions['width']) ? NULL : $dimensions['width'], - ]; - $this->bubble($style); - } + $this->addImageStyles($object, $data); return $data; } diff --git a/core/modules/image/src/Normalizer/ImageItemNormalizerTrait.php b/core/modules/image/src/Normalizer/ImageItemNormalizerTrait.php new file mode 100644 index 0000000..a37dcd0 --- /dev/null +++ b/core/modules/image/src/Normalizer/ImageItemNormalizerTrait.php @@ -0,0 +1,41 @@ +entityTypeManager->getStorage('file') + ->load($item->target_id); + $uri = $image->getFileUri(); + /** @var \Drupal\image\ImageStyleInterface[] $styles */ + $styles = $this->entityTypeManager->getStorage('image_style') + ->loadMultiple(); + $data['image_styles'] = []; + foreach ($styles as $id => $style) { + $dimensions = ['width' => $item->width, 'height' => $item->height]; + $style->transformDimensions($dimensions, $uri); + $data['image_styles'][$id] = [ + 'url' => file_url_transform_relative($style->buildUrl($uri)), + 'height' => empty($dimensions['height']) ? NULL : $dimensions['height'], + 'width' => empty($dimensions['width']) ? NULL : $dimensions['width'], + ]; + $this->bubble($style); + } + } + +}