fbcae8c7583fed0bab47af552357a553f7825951
[yaffs-website] / web / core / modules / hal / src / Normalizer / EntityReferenceItemNormalizer.php
1 <?php
2
3 namespace Drupal\hal\Normalizer;
4
5 use Drupal\Core\Entity\FieldableEntityInterface;
6 use Drupal\hal\LinkManager\LinkManagerInterface;
7 use Drupal\serialization\EntityResolver\EntityResolverInterface;
8 use Drupal\serialization\EntityResolver\UuidReferenceInterface;
9
10 /**
11  * Converts the Drupal entity reference item object to HAL array structure.
12  */
13 class EntityReferenceItemNormalizer extends FieldItemNormalizer implements UuidReferenceInterface {
14
15   /**
16    * The interface or class that this Normalizer supports.
17    *
18    * @var string
19    */
20   protected $supportedInterfaceOrClass = 'Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem';
21
22   /**
23    * The hypermedia link manager.
24    *
25    * @var \Drupal\hal\LinkManager\LinkManagerInterface
26    */
27   protected $linkManager;
28
29   /**
30    * The entity resolver.
31    *
32    * @var \Drupal\serialization\EntityResolver\EntityResolverInterface
33    */
34   protected $entityResolver;
35
36   /**
37    * Constructs an EntityReferenceItemNormalizer object.
38    *
39    * @param \Drupal\hal\LinkManager\LinkManagerInterface $link_manager
40    *   The hypermedia link manager.
41    * @param \Drupal\serialization\EntityResolver\EntityResolverInterface $entity_Resolver
42    *   The entity resolver.
43    */
44   public function __construct(LinkManagerInterface $link_manager, EntityResolverInterface $entity_Resolver) {
45     $this->linkManager = $link_manager;
46     $this->entityResolver = $entity_Resolver;
47   }
48
49   /**
50    * {@inheritdoc}
51    */
52   public function normalize($field_item, $format = NULL, array $context = []) {
53     /** @var $field_item \Drupal\Core\Field\FieldItemInterface */
54     $target_entity = $field_item->get('entity')->getValue();
55
56     // If this is not a content entity, let the parent implementation handle it,
57     // only content entities are supported as embedded resources.
58     if (!($target_entity instanceof FieldableEntityInterface)) {
59       return parent::normalize($field_item, $format, $context);
60     }
61
62     // If the parent entity passed in a langcode, unset it before normalizing
63     // the target entity. Otherwise, untranslatable fields of the target entity
64     // will include the langcode.
65     $langcode = isset($context['langcode']) ? $context['langcode'] : NULL;
66     unset($context['langcode']);
67     $context['included_fields'] = ['uuid'];
68
69     // Normalize the target entity.
70     $embedded = $this->serializer->normalize($target_entity, $format, $context);
71     $link = $embedded['_links']['self'];
72     // If the field is translatable, add the langcode to the link relation
73     // object. This does not indicate the language of the target entity.
74     if ($langcode) {
75       $embedded['lang'] = $link['lang'] = $langcode;
76     }
77
78     // The returned structure will be recursively merged into the normalized
79     // entity so that the items are properly added to the _links and _embedded
80     // objects.
81     $field_name = $field_item->getParent()->getName();
82     $entity = $field_item->getEntity();
83     $field_uri = $this->linkManager->getRelationUri($entity->getEntityTypeId(), $entity->bundle(), $field_name, $context);
84     return [
85       '_links' => [
86         $field_uri => [$link],
87       ],
88       '_embedded' => [
89         $field_uri => [$embedded],
90       ],
91     ];
92   }
93
94   /**
95    * {@inheritdoc}
96    */
97   protected function constructValue($data, $context) {
98     $field_item = $context['target_instance'];
99     $field_definition = $field_item->getFieldDefinition();
100     $target_type = $field_definition->getSetting('target_type');
101     $id = $this->entityResolver->resolve($this, $data, $target_type);
102     if (isset($id)) {
103       return ['target_id' => $id];
104     }
105     return NULL;
106   }
107
108   /**
109    * {@inheritdoc}
110    */
111   public function getUuid($data) {
112     if (isset($data['uuid'])) {
113       $uuid = $data['uuid'];
114       // The value may be a nested array like $uuid[0]['value'].
115       if (is_array($uuid) && isset($uuid[0]['value'])) {
116         $uuid = $uuid[0]['value'];
117       }
118       return $uuid;
119     }
120   }
121
122 }