EntityNormalizerValue.php in JSON:API 8
File
src/Normalizer/Value/EntityNormalizerValue.php
View source
<?php
namespace Drupal\jsonapi\Normalizer\Value;
use Drupal\Core\Cache\CacheableDependencyInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\jsonapi\Normalizer\CacheableDependencyTrait;
class EntityNormalizerValue implements ValueExtractorInterface, CacheableDependencyInterface {
use CacheableDependencyTrait;
use CacheableDependenciesMergerTrait;
protected $values;
protected $includes;
protected $context;
protected $entity;
protected $linkManager;
public function __construct(array $values, array $context, EntityInterface $entity, array $link_context) {
$this
->setCacheability(static::mergeCacheableDependencies(array_merge([
$entity,
], $values)));
$this->includes = array_map(function ($value) {
return $value
->getIncludes();
}, $values);
$this->values = array_filter($values, function ($value) {
return !($value instanceof NullFieldNormalizerValue || $value instanceof IncludeOnlyRelationshipNormalizerValue);
});
$this->context = $context;
$this->entity = $entity;
$this->linkManager = $link_context['link_manager'];
$this->includes = array_reduce($this->includes, function ($carry, $includes) {
return array_merge($carry, $includes);
}, []);
$this->includes = array_filter($this->includes);
}
public function rasterizeValue() {
$rasterized = [
'type' => $this->context['resource_type']
->getTypeName(),
'id' => $this->entity
->uuid(),
'attributes' => [],
'relationships' => [],
];
$rasterized['links'] = [
'self' => $this->linkManager
->getEntityLink($rasterized['id'], $this->context['resource_type'], [], 'individual'),
];
foreach ($this
->getValues() as $field_name => $normalizer_value) {
$rasterized[$normalizer_value
->getPropertyType()][$field_name] = $normalizer_value
->rasterizeValue();
}
return array_filter($rasterized);
}
public function rasterizeIncludes() {
return array_map(function ($include) {
return $include
->rasterizeValue();
}, $this
->getIncludes());
}
public function getValues() {
return $this->values;
}
public function getIncludes() {
$nested_includes = array_map(function ($include) {
return $include
->getIncludes();
}, $this->includes);
return array_reduce(array_filter($nested_includes), function ($carry, $item) {
return array_merge($carry, $item);
}, $this->includes);
}
}