Skip to content
Snippets Groups Projects

Compatibility with core schema generation

3 files
+ 33
31
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -3,11 +3,15 @@
namespace Drupal\jsonapi_extras\Normalizer;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\jsonapi\Normalizer\FieldItemNormalizer as JsonapiFieldItemNormalizer;
use Drupal\jsonapi\Normalizer\Value\CacheableNormalization;
use Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface;
use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerManager;
use Drupal\serialization\Normalizer\CacheableNormalizerInterface;
use Drupal\serialization\Normalizer\SchematicNormalizerHelperTrait;
use Shaper\Util\Context;
/**
@@ -15,46 +19,36 @@ use Shaper\Util\Context;
*/
class FieldItemNormalizer extends JsonApiNormalizerDecoratorBase {
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The field enhancer manager.
*
* @var \Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerManager
*/
protected $enhancerManager;
use SchematicNormalizerHelperTrait;
/**
* Constructs a new FieldItemNormalizer.
*
* @param \Drupal\jsonapi\Normalizer\FieldItemNormalizer $inner
* The JSON:API field normalizer entity.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
* @param \Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerManager $enhancer_manager
* The field enhancer manager.
*/
public function __construct(JsonapiFieldItemNormalizer $inner, EntityTypeManagerInterface $entity_type_manager, ResourceFieldEnhancerManager $enhancer_manager) {
public function __construct(
JsonapiFieldItemNormalizer $inner,
protected EntityTypeManagerInterface $entityTypeManager,
protected ResourceFieldEnhancerManager $enhancerManager,
protected ResourceTypeRepositoryInterface $resourceTypeRepository,
) {
parent::__construct($inner);
$this->entityTypeManager = $entity_type_manager;
$this->enhancerManager = $enhancer_manager;
}
/**
* {@inheritdoc}
*/
public function normalize($object, $format = NULL, array $context = []) {
// First get the regular output.
$normalized_output = parent::normalize($object, $format, $context);
// Then detect if there is any enhancer to be applied here.
/** @var \Drupal\jsonapi_extras\ResourceType\ConfigurableResourceType $resource_type */
$resource_type = $context['resource_object']->getResourceType();
// Detect if there is any enhancer to be applied here.
assert($object instanceof FieldItemInterface);
$entity = $object->getParent()->getParent()->getEntity();
assert($entity instanceof EntityInterface);
$resource_type = $this->resourceTypeRepository->get($entity->getEntityTypeId(), $entity->bundle());
$enhancer = $resource_type->getFieldEnhancer($object->getParent()->getName());
// Early return on schema generation.
if ($format === 'json_schema') {
return $enhancer
? $enhancer->getOutputJsonSchema()
: parent::normalize($object, $format, $context);
}
$normalized_output = parent::normalize($object, $format, $context);
if (!$enhancer) {
return $normalized_output;
}
Loading