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
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

namespace ApiPlatform\Doctrine\Odm\Metadata\Resource;

use ApiPlatform\Doctrine\Odm\State\Options;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
Expand Down Expand Up @@ -79,7 +78,7 @@ private function enrichOperation(Operation $operation, string $resourceClass): O
return $operation;
}

$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();
if (!$this->managerRegistry->getManagerForClass($documentClass) instanceof DocumentManager) {
return $operation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@

if ($operations) {
foreach ($resourceMetadata->getOperations() as $operationName => $operation) {
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();
if (!$this->managerRegistry->getManagerForClass($documentClass) instanceof DocumentManager) {
continue;
}
Expand All @@ -62,7 +62,7 @@

if ($graphQlOperations) {
foreach ($graphQlOperations as $operationName => $graphQlOperation) {
$documentClass = $this->getStateOptionsClass($graphQlOperation, $graphQlOperation->getClass(), Options::class);
$documentClass = $operation->getDataClass();

Check failure on line 65 in src/Doctrine/Odm/Metadata/Resource/DoctrineMongoDbOdmResourceCollectionMetadataFactory.php

View workflow job for this annotation

GitHub Actions / PHPStan (PHP 8.5)

Variable $operation might not be defined.
if (!$this->managerRegistry->getManagerForClass($documentClass) instanceof DocumentManager) {
continue;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Doctrine/Odm/State/CollectionProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource

public function provide(Operation $operation, array $uriVariables = [], array $context = []): iterable
{
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();

/** @var DocumentManager $manager */
$manager = $this->managerRegistry->getManagerForClass($documentClass);
Expand Down
2 changes: 1 addition & 1 deletion src/Doctrine/Odm/State/ItemProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource

public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?object
{
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();

/** @var DocumentManager $manager */
$manager = $this->managerRegistry->getManagerForClass($documentClass);
Expand Down
4 changes: 2 additions & 2 deletions src/Doctrine/Odm/State/LinksHandlerTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -133,15 +133,15 @@ private function buildAggregation(string $toClass, array $links, array $identifi

private function getLinkFromClass(Link $link, Operation $operation): string
{
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$documentClass = $operation->getDataClass();
$fromClass = $link->getFromClass();
if ($fromClass === $operation->getClass() && $documentClass) {
return $documentClass;
}

$operation = $this->resourceMetadataCollectionFactory->create($fromClass)->getOperation();

if ($documentClass = $this->getStateOptionsClass($operation, null, Options::class)) {
if ($documentClass = $operation->getDataClass()) {
return $documentClass;
}

Expand Down
9 changes: 7 additions & 2 deletions src/Doctrine/Odm/State/Options.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
namespace ApiPlatform\Doctrine\Odm\State;

use ApiPlatform\Doctrine\Common\State\Options as CommonOptions;
use ApiPlatform\State\OptionsInterface;
use ApiPlatform\State\DataOptionsInterface;

class Options extends CommonOptions implements OptionsInterface
class Options extends CommonOptions implements DataOptionsInterface
{
/**
* @param mixed $handleLinks experimental callable, typed mixed as we may want a service name in the future
Expand All @@ -30,6 +30,11 @@ public function __construct(
parent::__construct(handleLinks: $handleLinks);
}

public function getDataClass(): ?string
{
return $this->documentClass;
}

public function getDocumentClass(): ?string
{
return $this->documentClass;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

namespace ApiPlatform\Doctrine\Orm\Metadata\Resource;

use ApiPlatform\Doctrine\Orm\State\Options;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
Expand Down Expand Up @@ -77,7 +76,7 @@ private function enrichOperation(Operation $operation, string $resourceClass): O
return $operation;
}

$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$entityClass = $operation->getDataClass();
if (!$this->managerRegistry->getManagerForClass($entityClass) instanceof EntityManagerInterface) {
return $operation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@

if ($operations) {
foreach ($operations as $operationName => $operation) {
$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$entityClass = $operation->getDataClass();

$manager = $this->managerRegistry->getManagerForClass($entityClass);
if (!$manager instanceof EntityManagerInterface) {
Expand All @@ -74,7 +74,7 @@

if ($graphQlOperations) {
foreach ($graphQlOperations as $operationName => $graphQlOperation) {
$entityClass = $this->getStateOptionsClass($graphQlOperation, $graphQlOperation->getClass(), Options::class);
$entityClass = $operation->getDataClass();

Check failure on line 77 in src/Doctrine/Orm/Metadata/Resource/DoctrineOrmResourceCollectionMetadataFactory.php

View workflow job for this annotation

GitHub Actions / PHPStan (PHP 8.5)

Variable $operation might not be defined.

if (!$this->managerRegistry->getManagerForClass($entityClass) instanceof EntityManagerInterface) {
continue;
Expand Down
2 changes: 1 addition & 1 deletion src/Doctrine/Orm/State/CollectionProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource

public function provide(Operation $operation, array $uriVariables = [], array $context = []): iterable
{
$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$entityClass = $operation->getDataClass();

/** @var EntityManagerInterface $manager */
$manager = $this->managerRegistry->getManagerForClass($entityClass);
Expand Down
2 changes: 1 addition & 1 deletion src/Doctrine/Orm/State/ItemProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource

public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?object
{
$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$entityClass = $operation->getDataClass();

/** @var EntityManagerInterface|null $manager */
$manager = $this->managerRegistry->getManagerForClass($entityClass);
Expand Down
4 changes: 2 additions & 2 deletions src/Doctrine/Orm/State/LinksHandlerTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,12 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que
private function getLinkFromClass(Link $link, Operation $operation): string
{
$fromClass = $link->getFromClass();
if ($fromClass === $operation->getClass() && $entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class)) {
if ($fromClass === $operation->getClass() && $entityClass = $operation->getDataClass()) {
return $entityClass;
}

$operation = $this->resourceMetadataCollectionFactory->create($fromClass)->getOperation();

return $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
return $operation->getDataClass();
}
}
9 changes: 7 additions & 2 deletions src/Doctrine/Orm/State/Options.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
namespace ApiPlatform\Doctrine\Orm\State;

use ApiPlatform\Doctrine\Common\State\Options as CommonOptions;
use ApiPlatform\State\OptionsInterface;
use ApiPlatform\State\DataOptionsInterface;

class Options extends CommonOptions implements OptionsInterface
class Options extends CommonOptions implements DataOptionsInterface
{
/**
* @param string|callable $handleLinks experimental callable, typed mixed as we may want a service name in the future
Expand All @@ -30,6 +30,11 @@ public function __construct(
parent::__construct(handleLinks: $handleLinks);
}

public function getDataClass(): ?string
{
return $this->entityClass;
}

public function getEntityClass(): ?string
{
return $this->entityClass;
Expand Down
14 changes: 8 additions & 6 deletions src/GraphQl/Serializer/SerializerContextBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,14 @@ 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'] = $operation->getInputClass() === $operation->getClass() ? null : ['class' => $operation->getInputClass()];
$context['output'] = $operation->getOutputClass() === $operation->getClass() ? null : ['class' => $operation->getOutputClass()];
// if (($inputClass = $operation->getInputClass()) !== $operation->getClass()) {
// $context['input'] = ['class' => $inputClass];
// }
// if (($outputClass = $operation->getOutputClass()) !== $operation->getClass()) {
// $context['output'] = ['class' => $outputClass];
// }
$context = $normalization ? array_merge($operation->getNormalizationContext() ?? [], $context) : array_merge($operation->getDenormalizationContext() ?? [], $context);

if ($normalization) {
Expand Down
2 changes: 1 addition & 1 deletion src/GraphQl/Type/FieldsBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -616,7 +616,7 @@ private function getFilterArgs(array $args, ?string $resourceClass, string $root
continue;
}

$entityClass = $this->getStateOptionsClass($resourceOperation, $resourceOperation->getClass());
$entityClass = $resourceOperation->getDataClass();
foreach ($this->filterLocator->get($filterId)->getDescription($entityClass) as $key => $description) {
$filterType = \in_array($description['type'], TypeIdentifier::values(), true) ? Type::builtin($description['type']) : Type::object($description['type']);
if (!($description['required'] ?? false)) {
Expand Down
7 changes: 2 additions & 5 deletions src/GraphQl/Type/TypeBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -311,15 +311,12 @@ private function getQueryOperation(ResourceMetadataCollection $resourceMetadataC
private function getResourceObjectTypeConfiguration(string $shortName, ResourceMetadataCollection $resourceMetadataCollection, Operation $operation, array $context = []): InputObjectType|ObjectType
{
$operationName = $operation->getName();
$resourceClass = $operation->getClass();
$input = $context['input'];
$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']) {
$resourceClass = $ioMetadata['class'];
}
$resourceClass = $input ? $operation->getInputClass() : $operation->getOutputClass();
$ioMetadata = $resourceClass ? ['class' => $resourceClass] : null;

$wrapData = !$wrapped && ($operation instanceof Mutation || $operation instanceof Subscription) && !$input && $depth < 1;

Expand Down
2 changes: 1 addition & 1 deletion src/Hydra/Serializer/CollectionFiltersNormalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public function normalize(mixed $data, ?string $format = null, array $context =
}
}

$resourceClass = $this->getStateOptionsClass($operation, $resourceClass);
$resourceClass = $operation->getDataClass();

if ($currentFilters || ($parameters && \count($parameters))) {
$hydraPrefix = $this->getHydraPrefix($context + $this->defaultContext);
Expand Down
13 changes: 4 additions & 9 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,8 @@ 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
5 changes: 2 additions & 3 deletions src/JsonSchema/ResourceMetadataTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,10 @@ trait ResourceMetadataTrait

private function findOutputClass(string $className, string $type, Operation $operation, ?array $serializerContext): ?string
{
$inputOrOutput = ['class' => $className];
$inputOrOutput = Schema::TYPE_OUTPUT === $type ? ($operation->getOutput() ?? $inputOrOutput) : ($operation->getInput() ?? $inputOrOutput);
$resourceClass = (Schema::TYPE_OUTPUT === $type ? $operation->getOutputClass() : $operation->getInputClass()) ?? $className;
$forceSubschema = $serializerContext[SchemaFactory::FORCE_SUBSCHEMA] ?? false;

return $forceSubschema ? ($inputOrOutput['class'] ?? $inputOrOutput->class ?? $operation->getClass()) : ($inputOrOutput['class'] ?? $inputOrOutput->class ?? null);
return $forceSubschema ? ($resourceClass ?? $operation->getClass()) : $resourceClass;
}

private function findOperation(string $className, string $type, ?Operation $operation, ?array $serializerContext, ?string $format = null): Operation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

use ApiPlatform\Laravel\Eloquent\State\CollectionProvider;
use ApiPlatform\Laravel\Eloquent\State\ItemProvider;
use ApiPlatform\Laravel\Eloquent\State\Options;
use ApiPlatform\Laravel\Eloquent\State\PersistProcessor;
use ApiPlatform\Laravel\Eloquent\State\RemoveProcessor;
use ApiPlatform\Metadata\CollectionOperationInterface;
Expand Down Expand Up @@ -81,7 +80,7 @@ public function create(string $resourceClass): ResourceMetadataCollection
$operations = $resourceMetadata->getOperations();
foreach ($operations ?? [] as $operationName => $operation) {
// Check if this operation uses Eloquent via stateOptions
$modelClass = $this->getStateOptionsClass($operation, $resourceClass, Options::class);
$modelClass = $operation->getDataClass();
$usesEloquent = $isModel || ($modelClass !== $resourceClass);

if (!$usesEloquent) {
Expand Down Expand Up @@ -115,7 +114,7 @@ public function create(string $resourceClass): ResourceMetadataCollection
$graphQlOperations = $resourceMetadata->getGraphQlOperations();
foreach ($graphQlOperations ?? [] as $operationName => $graphQlOperation) {
// Check if this operation uses Eloquent via stateOptions
$modelClass = $this->getStateOptionsClass($graphQlOperation, $resourceClass, Options::class);
$modelClass = $operation->getDataClass();
$usesEloquent = $isModel || ($modelClass !== $resourceClass);

if (!$usesEloquent) {
Expand Down
2 changes: 1 addition & 1 deletion src/Laravel/Eloquent/State/CollectionProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public function __construct(

public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
$resourceClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$resourceClass = $operation->getDataClass();
$model = new $resourceClass();

if (!$model instanceof Model) {
Expand Down
2 changes: 1 addition & 1 deletion src/Laravel/Eloquent/State/ItemProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public function __construct(

public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
$resourceClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
$resourceClass = $operation->getDataClass();
$model = new $resourceClass();

if (!$model instanceof Model) {
Expand Down
9 changes: 7 additions & 2 deletions src/Laravel/Eloquent/State/Options.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@

namespace ApiPlatform\Laravel\Eloquent\State;

use ApiPlatform\State\OptionsInterface;
use ApiPlatform\State\DataOptionsInterface;

class Options implements OptionsInterface
class Options implements DataOptionsInterface
{
/**
* @param string|callable $handleLinks experimental callable, typed mixed as we may want a service name in the future
Expand All @@ -28,6 +28,11 @@ public function __construct(
) {
}

public function getDataClass(): ?string
{
return $this->modelClass;
}

public function getHandleLinks(): mixed
{
return $this->handleLinks;
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
Loading
Loading