JsonSchemaReflectionTrait.php

Namespace

Drupal\serialization\Normalizer

File

core/modules/serialization/src/Normalizer/JsonSchemaReflectionTrait.php

View source
<?php

declare (strict_types=1);
namespace Drupal\serialization\Normalizer;

use Drupal\Core\Serialization\Attribute\JsonSchema;

/**
 * Interface for using reflection with the JSON object.
 */
trait JsonSchemaReflectionTrait {
    
    /**
     * Get a JSON Schema based on method reflection.
     *
     * @param object $object
     *   Object to reflect.
     * @param string $method
     *   Method to reflect.
     * @param array $fallback
     *   Fallback. Defaults to an empty array, which is a matches-all schema.
     * @param bool $nullable
     *   If a schema is returned from reflection, whether to add a null option.
     *
     * @return array
     *   JSON Schema.
     */
    protected function getJsonSchemaForMethod(mixed $object, string $method, array $fallback = [], bool $nullable = FALSE) : array {
        $schemas = [];
        if ((is_object($object) || class_exists($object)) && method_exists($object, $method)) {
            $reflection = new \ReflectionMethod($object, $method);
            $schemas = $reflection->getAttributes(JsonSchema::class);
        }
        if (count($schemas) === 0) {
            return $fallback;
        }
        $schemas = array_values(array_filter([
            array_map(fn($schema) => $schema->newInstance()
                ->getJsonSchema(), $schemas),
            $nullable ? [
                'type' => 'null',
            ] : NULL,
        ]));
        return count($schemas) === 1 ? current($schemas) : [
            'oneOf' => $schemas,
        ];
    }

}

Traits

Title Deprecated Summary
JsonSchemaReflectionTrait Interface for using reflection with the JSON object.

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