Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions src/GraphQl/Serializer/SerializerContextBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,8 @@ public function create(?string $resourceClass, Operation $operation, array $reso
}

$context['operation'] = $operation;
if ($operation->getInput()) {
$context['input'] = $operation->getInput();
}
if ($operation->getOutput()) {
$context['output'] = $operation->getOutput();
}
$context['input'] =['class' => $operation->getInputClass()];
$context['output'] = ['class' => $operation->getOutputClass()];
$context = $normalization ? array_merge($operation->getNormalizationContext() ?? [], $context) : array_merge($operation->getDenormalizationContext() ?? [], $context);

if ($normalization) {
Expand Down
2 changes: 1 addition & 1 deletion src/GraphQl/State/Provider/ResolverProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
$item = $queryResolver($item, $context);
if (!$operation instanceof CollectionOperationInterface) {
// The item retrieved can be of another type when using an identifier (see Relay Nodes at query.feature:23)
$this->getResourceClass($item, $operation->getOutput()['class'] ?? $operation->getClass(), \sprintf('Custom query resolver "%s"', $queryResolverId).' has to return an item of class %s but returned an item of class %s.');
$this->getResourceClass($item, $operation->getOutputClass(), \sprintf('Custom query resolver "%s"', $queryResolverId).' has to return an item of class %s but returned an item of class %s.');
}

return $item;
Expand Down
4 changes: 2 additions & 2 deletions src/GraphQl/Type/TypeBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -316,8 +316,8 @@ private function getResourceObjectTypeConfiguration(string $shortName, ResourceM
$depth = $context['depth'] ?? 0;
$wrapped = $context['wrapped'] ?? false;

$ioMetadata = $input ? $operation->getInput() : $operation->getOutput();
if (null !== $ioMetadata && \array_key_exists('class', $ioMetadata) && null !== $ioMetadata['class']) {
$ioMetadata = $input ? $operation->getInputClass() : $operation->getOutputClass();
if (null !== $ioMetadata ) {
$resourceClass = $ioMetadata['class'];
}

Expand Down
12 changes: 4 additions & 8 deletions src/Hydra/Serializer/DocumentationNormalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -216,13 +216,11 @@ private function getHydraProperties(string $resourceClass, ApiResource $resource
continue;
}

$inputMetadata = $operation->getInput();
if (null !== $inputClass = $inputMetadata['class'] ?? null) {
if (null !== $inputClass = $operation->getInputClass()) {
$classes[$inputClass] = true;
}

$outputMetadata = $operation->getOutput();
if (null !== $outputClass = $outputMetadata['class'] ?? null) {
if (null !== $outputClass = $operation->getOutputClass()) {
$classes[$outputClass] = true;
}
}
Expand Down Expand Up @@ -288,11 +286,9 @@ private function getHydraOperation(HttpOperation $operation, string $prefixedSho
}

$shortName = $operation->getShortName();
$inputMetadata = $operation->getInput() ?? [];
$outputMetadata = $operation->getOutput() ?? [];

$inputClass = \array_key_exists('class', $inputMetadata) ? $inputMetadata['class'] : false;
$outputClass = \array_key_exists('class', $outputMetadata) ? $outputMetadata['class'] : false;
$inputClass = $operation->getInputClass();
$outputClass = $operation->getOutputClass();

if ('GET' === $method && $operation instanceof CollectionOperationInterface) {
$hydraOperation += [
Expand Down
1 change: 1 addition & 0 deletions src/JsonSchema/ResourceMetadataTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ trait ResourceMetadataTrait

private function findOutputClass(string $className, string $type, Operation $operation, ?array $serializerContext): ?string
{
// TODO
$inputOrOutput = ['class' => $className];
$inputOrOutput = Schema::TYPE_OUTPUT === $type ? ($operation->getOutput() ?? $inputOrOutput) : ($operation->getInput() ?? $inputOrOutput);
$forceSubschema = $serializerContext[SchemaFactory::FORCE_SUBSCHEMA] ?? false;
Expand Down
4 changes: 2 additions & 2 deletions src/Mcp/Capability/Registry/Loader.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,13 @@ public function load(RegistryInterface $registry): void
foreach ($metadata as $resource) {
foreach ($resource->getMcp() ?? [] as $mcp) {
if ($mcp instanceof McpTool) {
$inputClass = $mcp->getInput()['class'] ?? $mcp->getClass();
$inputClass = $mcp->getInputClass();
$inputFormat = array_key_first($mcp->getInputFormats() ?? ['json' => ['application/json']]);
$inputSchema = $this->schemaFactory->buildSchema($inputClass, $inputFormat, Schema::TYPE_INPUT, $mcp, null, [SchemaFactory::FORCE_SUBSCHEMA => true]);

$outputSchema = null;
if (false !== $mcp->getStructuredContent()) {
$outputClass = $mcp->getOutput()['class'] ?? $mcp->getClass();
$outputClass = $mcp->getOutputClass();
$outputFormat = array_key_first($mcp->getOutputFormats() ?? ['json' => ['application/json']]);
$outputSchema = $this->schemaFactory->buildSchema($outputClass, $outputFormat, Schema::TYPE_OUTPUT, $mcp, null, [SchemaFactory::FORCE_SUBSCHEMA => true])->getArrayCopy();
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mcp/State/ToolProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
}

$data = (object) $context['mcp_data'];
$class = $operation->getInput()['class'] ?? $operation->getClass();
$class = $operation->getInputClass();

return $this->objectMapper->map($data, $class);
}
Expand Down
16 changes: 16 additions & 0 deletions src/Metadata/Metadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,14 @@ public function getInput(): mixed
return $this->input;
}

/**
* @return class-string|null
*/
public function getInputClass(): ?string
{
return isset($this->input['class']) ? $this->input['class'] : $this->getClass();
}

public function withInput(mixed $input): static
{
$self = clone $this;
Expand All @@ -290,6 +298,14 @@ public function getOutput(): mixed
return $this->output;
}

/**
* @return class-string|null
*/
public function getOutputClass(): ?string
{
return isset($this->output['class']) ? $this->inpuoutputt['class'] : $this->getClass();
}

public function withOutput(mixed $output): static
{
$self = clone $this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public function create(string $resourceClass): ResourceMetadataCollection
$resourceMetadataCollection = $this->decorated->create($resourceClass);

foreach ($resourceMetadataCollection as $key => $resourceMetadata) {
// TODO
$resourceMetadata = $resourceMetadata->withInput($this->transformInputOutput($resourceMetadata->getInput()));
$resourceMetadata = $resourceMetadata->withOutput($this->transformInputOutput($resourceMetadata->getOutput()));

Expand Down Expand Up @@ -65,19 +66,15 @@ private function getTransformedOperations(Operations|array $operations, ApiResou
$operation = $operation->withOutput(null !== $operation->getOutput() ? $this->transformInputOutput($operation->getOutput()) : $resourceMetadata->getOutput());

if (
$operation->getInput()
&& \array_key_exists('class', $operation->getInput())
&& null === $operation->getInput()['class']
null === $operation->getInputClass()
) {
$operation = $operation->withDeserialize(null === $operation->canDeserialize() ? false : $operation->canDeserialize());
$operation = $operation->withValidate(null === $operation->canValidate() ? false : $operation->canValidate());
}

if (
$operation instanceof HttpOperation
&& $operation->getOutput()
&& \array_key_exists('class', $operation->getOutput())
&& null === $operation->getOutput()['class']
&& null === $operation->getOutputClass()
&& null === $operation->getStatus()
) {
$operation = $operation->withStatus(204);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ public function create(string $resourceClass): ResourceMetadataCollection
$entityClass = $options->getModelClass();
}

$class = $operation->getInput()['class'] ?? $operation->getClass();
$outputClass = $operation->getOutput()['class'] ?? null;
$class = $operation->getInputClass();
$outputClass = $operation->getOutputClass();
$entityMap = null;

// Look for Mapping metadata
Expand Down
4 changes: 2 additions & 2 deletions src/OpenApi/Factory/OpenApiFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ private function collectPaths(ApiResource $resource, ResourceMetadataCollection

if (
\in_array($method, ['PATCH', 'PUT', 'POST'], true)
&& !(false === ($input = $operation->getInput()) || (\is_array($input) && null === $input['class']))
&& $operation->getInputClass() !== null
) {
$content = $openapiOperation->getRequestBody()?->getContent();
if (null === $content) {
Expand Down Expand Up @@ -501,7 +501,7 @@ private function collectPaths(ApiResource $resource, ResourceMetadataCollection
*/
private function buildOpenApiResponse(array $existingResponses, int|string $status, string $description, Operation $openapiOperation, ?HttpOperation $operation = null, ?array $responseMimeTypes = null, ?array $operationOutputSchemas = null, ?ResourceMetadataCollection $resourceMetadataCollection = null, bool $isErrorResponse = false): Operation
{
$noOutput = !$isErrorResponse && \is_array($operation?->getOutput()) && null === $operation->getOutput()['class'];
$noOutput = !$isErrorResponse && null === $operation?->getOutputClass();

$response = $existingResponses[$status] ?? new Response($description);
if (null === $response->getDescription()) {
Expand Down
4 changes: 2 additions & 2 deletions src/Serializer/SerializerContextBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ public function createFromRequest(Request $request, bool $normalization, ?array
$context['iri_only'] ??= false;
$context['request_uri'] = $request->getRequestUri();
$context['uri'] = $request->getUri();
$context['input'] = $operation->getInput();
$context['output'] = $operation->getOutput();
$context['input'] = ['class' => $operation->getInputClass()];
$context['output'] = ['class' => $operation->getOutputClass()];

// Special case as this is usually handled by our OperationContextTrait, here we want to force the IRI in the response
if (!$operation instanceof CollectionOperationInterface && method_exists($operation, 'getItemUriTemplate') && $operation->getItemUriTemplate()) {
Expand Down
2 changes: 1 addition & 1 deletion src/State/Processor/ObjectMapperInputProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public function __construct(

public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
$class = $operation->getInput()['class'] ?? $operation->getClass();
$class = $operation->getInputClass();

if (
$data instanceof Response
Expand Down
2 changes: 1 addition & 1 deletion src/State/Processor/ObjectMapperProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public function __construct(

public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
$class = $operation->getInput()['class'] ?? $operation->getClass();
$class = $operation->getInputClass();

if (
$data instanceof Response
Expand Down
3 changes: 1 addition & 2 deletions src/State/Provider/ContentNegotiationProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,7 @@ private function flattenMimeTypes(array $formats): array
private function getInputFormat(HttpOperation $operation, Request $request): ?string
{
if (
false === ($input = $operation->getInput())
|| (\is_array($input) && null === $input['class'])
null === $operation->getInputClass()
|| false === $operation->canDeserialize()
) {
return null;
Expand Down
2 changes: 1 addition & 1 deletion src/State/Provider/ObjectMapperProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public function __construct(
public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
$data = $this->decorated->provide($operation, $uriVariables, $context);
$class = $operation->getOutput()['class'] ?? $operation->getClass();
$class = $operation->getOutputClass();

if (!$this->objectMapper || !$operation->canMap()) {
return $data;
Expand Down
2 changes: 1 addition & 1 deletion src/State/Util/HttpResponseHeadersTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ private function getHeaders(Request $request, HttpOperation $operation, array $c

$method = $request->getMethod();
$originalData = $context['original_data'] ?? null;
$outputMetadata = $operation->getOutput() ?? ['class' => $operation->getClass()];
$outputMetadata = ['class' => $operation->getOutputClass()];
$hasOutput = \is_array($outputMetadata) && \array_key_exists('class', $outputMetadata) && null !== $outputMetadata['class'];
$hasData = !$hasOutput ? false : ($this->resourceClassResolver && $originalData && \is_object($originalData) && $this->resourceClassResolver->isResourceClass($this->getObjectClass($originalData)));

Expand Down
2 changes: 1 addition & 1 deletion src/State/Util/HttpResponseStatusTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ private function getStatus(Request $request, HttpOperation $operation, array $co
$status = $operation->getStatus();
$method = $request->getMethod();

$outputMetadata = $operation->getOutput() ?? ['class' => $operation->getClass()];
$outputMetadata = ['class' => $operation->getOutputClass()];
$hasOutput = \is_array($outputMetadata) && \array_key_exists('class', $outputMetadata) && null !== $outputMetadata['class'];
$originalData = $context['original_data'] ?? null;
$hasData = !$hasOutput ? false : ($this->resourceClassResolver && $originalData && \is_object($originalData) && $this->resourceClassResolver->isResourceClass($this->getObjectClass($originalData)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class DummyCollectionDtoProvider implements ProviderInterface
{
public function provide(Operation $operation, array $uriVariables = [], array $context = []): array
{
$class = $operation->getOutput()['class'];
$class = $operation->getOutputClass();
switch ($class) {
case DummyCollectionDtoOutput::class:
case DummyFooCollectionDto::class:
Expand Down
Loading