trait HalEntityNormalizationTrait

Same name and namespace in other branches
  1. 8.9.x core/modules/hal/tests/src/Functional/EntityResource/HalEntityNormalizationTrait.php \Drupal\Tests\hal\Functional\EntityResource\HalEntityNormalizationTrait

Trait for EntityResourceTestBase subclasses testing formats using HAL.

Hierarchy

19 files declare their use of HalEntityNormalizationTrait
BlockContentHalJsonAnonTest.php in core/modules/hal/tests/src/Functional/block_content/BlockContentHalJsonAnonTest.php
CommentHalJsonTestBase.php in core/modules/hal/tests/src/Functional/comment/CommentHalJsonTestBase.php
EntityTestBundleHalJsonAnonTest.php in core/modules/hal/tests/src/Functional/entity_test/EntityTestBundleHalJsonAnonTest.php
EntityTestHalJsonAnonTest.php in core/modules/hal/tests/src/Functional/entity_test/EntityTestHalJsonAnonTest.php
EntityTestHalJsonInternalPropertyNormalizerTest.php in core/modules/hal/tests/src/Functional/entity_test/EntityTestHalJsonInternalPropertyNormalizerTest.php

... See full list

File

core/modules/hal/tests/src/Functional/EntityResource/HalEntityNormalizationTrait.php, line 14

Namespace

Drupal\Tests\hal\Functional\EntityResource
View source
trait HalEntityNormalizationTrait {
    
    /**
     * Applies the HAL entity field normalization to an entity normalization.
     *
     * The HAL normalization:
     * - adds a 'lang' attribute to every translatable field
     * - omits reference fields, since references are stored in _links & _embedded
     * - omits empty fields (fields without value)
     *
     * @param array $normalization
     *   An entity normalization.
     *
     * @return array
     *   The updated entity normalization.
     */
    protected function applyHalFieldNormalization(array $normalization) {
        if (!$this->entity instanceof FieldableEntityInterface) {
            throw new \LogicException('This trait should only be used for fieldable entity types.');
        }
        // In the HAL normalization, all translatable fields get a 'lang' attribute.
        $translatable_non_reference_fields = array_keys(array_filter($this->entity
            ->getTranslatableFields(), function (FieldItemListInterface $field) {
            return !$field instanceof EntityReferenceFieldItemListInterface;
        }));
        foreach ($translatable_non_reference_fields as $field_name) {
            if (isset($normalization[$field_name])) {
                $normalization[$field_name][0]['lang'] = 'en';
            }
        }
        // In the HAL normalization, reference fields are omitted, except for the
        // bundle field.
        $bundle_key = $this->entity
            ->getEntityType()
            ->getKey('bundle');
        $reference_fields = array_keys(array_filter($this->entity
            ->getFields(), function (FieldItemListInterface $field) use ($bundle_key) {
            return $field instanceof EntityReferenceFieldItemListInterface && $field->getName() !== $bundle_key;
        }));
        foreach ($reference_fields as $field_name) {
            unset($normalization[$field_name]);
        }
        // In the HAL normalization, the bundle field  omits the 'target_type' and
        // 'target_uuid' properties, because it's encoded in the '_links' section.
        if ($bundle_key) {
            unset($normalization[$bundle_key][0]['target_type']);
            unset($normalization[$bundle_key][0]['target_uuid']);
        }
        // In the HAL normalization, empty fields are omitted.
        $empty_fields = array_keys(array_filter($this->entity
            ->getFields(), function (FieldItemListInterface $field) {
            return $field->isEmpty();
        }));
        foreach ($empty_fields as $field_name) {
            unset($normalization[$field_name]);
        }
        return $normalization;
    }
    
    /**
     * {@inheritdoc}
     */
    protected function assertNormalizationEdgeCases($method, Url $url, array $request_options) {
        // \Drupal\hal\Normalizer\EntityNormalizer::denormalize(): entity
        // types with bundles MUST send their bundle field to be denormalizable.
        if ($this->entity
            ->getEntityType()
            ->hasKey('bundle')) {
            $normalization = $this->getNormalizedPostEntity();
            $normalization['_links']['type'] = Url::fromUri('base:rest/type/' . static::$entityTypeId . '/bad_bundle_name');
            $request_options[RequestOptions::BODY] = $this->serializer
                ->encode($normalization, static::$format);
            // DX: 422 when incorrect entity type bundle is specified.
            $response = $this->request($method, $url, $request_options);
            $this->assertResourceErrorResponse(422, 'No entity type(s) specified', $response);
            unset($normalization['_links']['type']);
            $request_options[RequestOptions::BODY] = $this->serializer
                ->encode($normalization, static::$format);
            // DX: 422 when no entity type bundle is specified.
            $response = $this->request($method, $url, $request_options);
            $this->assertResourceErrorResponse(422, 'The type link relation must be specified.', $response);
        }
    }

}

Members

Title Sort descending Modifiers Object type Summary
HalEntityNormalizationTrait::applyHalFieldNormalization protected function Applies the HAL entity field normalization to an entity normalization.
HalEntityNormalizationTrait::assertNormalizationEdgeCases protected function

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.