Skip to content

Commit 1284cf8

Browse files
authored
refactor(state): state options code duplication (#7109)
1 parent 0cd9b9f commit 1284cf8

17 files changed

+110
-163
lines changed

src/Doctrine/Odm/Metadata/Resource/DoctrineMongoDbOdmResourceCollectionMetadataFactory.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@
2222
use ApiPlatform\Metadata\Operation;
2323
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
2424
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
25+
use ApiPlatform\State\Util\StateOptionsTrait;
2526
use Doctrine\ODM\MongoDB\DocumentManager;
2627
use Doctrine\Persistence\ManagerRegistry;
2728

2829
final class DoctrineMongoDbOdmResourceCollectionMetadataFactory implements ResourceMetadataCollectionFactoryInterface
2930
{
31+
use StateOptionsTrait;
32+
3033
public function __construct(private readonly ManagerRegistry $managerRegistry, private readonly ResourceMetadataCollectionFactoryInterface $decorated)
3134
{
3235
}
@@ -45,11 +48,7 @@ public function create(string $resourceClass): ResourceMetadataCollection
4548
if ($operations) {
4649
/** @var Operation $operation */
4750
foreach ($resourceMetadata->getOperations() as $operationName => $operation) {
48-
$documentClass = $operation->getClass();
49-
if (($options = $operation->getStateOptions()) && $options instanceof Options && $options->getDocumentClass()) {
50-
$documentClass = $options->getDocumentClass();
51-
}
52-
51+
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
5352
if (!$this->managerRegistry->getManagerForClass($documentClass) instanceof DocumentManager) {
5453
continue;
5554
}

src/Doctrine/Odm/State/CollectionProvider.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use ApiPlatform\Metadata\Operation;
2121
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
2222
use ApiPlatform\State\ProviderInterface;
23+
use ApiPlatform\State\Util\StateOptionsTrait;
2324
use Doctrine\ODM\MongoDB\DocumentManager;
2425
use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
2526
use Doctrine\Persistence\ManagerRegistry;
@@ -32,6 +33,7 @@ final class CollectionProvider implements ProviderInterface
3233
{
3334
use LinksHandlerLocatorTrait;
3435
use LinksHandlerTrait;
36+
use StateOptionsTrait;
3537

3638
/**
3739
* @param AggregationCollectionExtensionInterface[] $collectionExtensions
@@ -45,10 +47,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource
4547

4648
public function provide(Operation $operation, array $uriVariables = [], array $context = []): iterable
4749
{
48-
$documentClass = $operation->getClass();
49-
if (($options = $operation->getStateOptions()) && $options instanceof Options && $options->getDocumentClass()) {
50-
$documentClass = $options->getDocumentClass();
51-
}
50+
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
5251

5352
/** @var DocumentManager $manager */
5453
$manager = $this->managerRegistry->getManagerForClass($documentClass);

src/Doctrine/Odm/State/ItemProvider.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use ApiPlatform\Metadata\Operation;
2121
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
2222
use ApiPlatform\State\ProviderInterface;
23+
use ApiPlatform\State\Util\StateOptionsTrait;
2324
use Doctrine\ODM\MongoDB\DocumentManager;
2425
use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
2526
use Doctrine\Persistence\ManagerRegistry;
@@ -35,6 +36,7 @@ final class ItemProvider implements ProviderInterface
3536
{
3637
use LinksHandlerLocatorTrait;
3738
use LinksHandlerTrait;
39+
use StateOptionsTrait;
3840

3941
/**
4042
* @param AggregationItemExtensionInterface[] $itemExtensions
@@ -48,10 +50,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource
4850

4951
public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?object
5052
{
51-
$documentClass = $operation->getClass();
52-
if (($options = $operation->getStateOptions()) && $options instanceof Options && $options->getDocumentClass()) {
53-
$documentClass = $options->getDocumentClass();
54-
}
53+
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
5554

5655
/** @var DocumentManager $manager */
5756
$manager = $this->managerRegistry->getManagerForClass($documentClass);

src/Doctrine/Odm/State/LinksHandlerTrait.php

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use ApiPlatform\Metadata\Exception\RuntimeException;
1818
use ApiPlatform\Metadata\Link;
1919
use ApiPlatform\Metadata\Operation;
20+
use ApiPlatform\State\Util\StateOptionsTrait;
2021
use Doctrine\ODM\MongoDB\Aggregation\Builder;
2122
use Doctrine\ODM\MongoDB\DocumentManager;
2223
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
@@ -28,6 +29,7 @@
2829
trait LinksHandlerTrait
2930
{
3031
use CommonLinksHandlerTrait;
32+
use StateOptionsTrait;
3133

3234
private ManagerRegistry $managerRegistry;
3335

@@ -142,26 +144,18 @@ private function buildAggregation(string $toClass, array $links, array $identifi
142144

143145
private function getLinkFromClass(Link $link, Operation $operation): string
144146
{
147+
$documentClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
145148
$fromClass = $link->getFromClass();
146-
if ($fromClass === $operation->getClass() && $documentClass = $this->getStateOptionsDocumentClass($operation)) {
149+
if ($fromClass === $operation->getClass() && $documentClass) {
147150
return $documentClass;
148151
}
149152

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

152-
if ($documentClass = $this->getStateOptionsDocumentClass($operation)) {
155+
if ($documentClass = $this->getStateOptionsClass($operation, null, Options::class)) {
153156
return $documentClass;
154157
}
155158

156159
throw new \Exception('Can not found a doctrine class for this link.');
157160
}
158-
159-
private function getStateOptionsDocumentClass(Operation $operation): ?string
160-
{
161-
if (($options = $operation->getStateOptions()) && $options instanceof Options && $documentClass = $options->getDocumentClass()) {
162-
return $documentClass;
163-
}
164-
165-
return null;
166-
}
167161
}

src/Doctrine/Orm/Metadata/Resource/DoctrineOrmResourceCollectionMetadataFactory.php

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@
2222
use ApiPlatform\Metadata\Operation;
2323
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
2424
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
25+
use ApiPlatform\State\Util\StateOptionsTrait;
2526
use Doctrine\ORM\EntityManagerInterface;
2627
use Doctrine\Persistence\ManagerRegistry;
2728

2829
final class DoctrineOrmResourceCollectionMetadataFactory implements ResourceMetadataCollectionFactoryInterface
2930
{
31+
use StateOptionsTrait;
32+
3033
public function __construct(private readonly ManagerRegistry $managerRegistry, private readonly ResourceMetadataCollectionFactoryInterface $decorated)
3134
{
3235
}
@@ -45,10 +48,7 @@ public function create(string $resourceClass): ResourceMetadataCollection
4548
if ($operations) {
4649
/** @var Operation $operation */
4750
foreach ($resourceMetadata->getOperations() as $operationName => $operation) {
48-
$entityClass = $operation->getClass();
49-
if (($options = $operation->getStateOptions()) && $options instanceof Options && $options->getEntityClass()) {
50-
$entityClass = $options->getEntityClass();
51-
}
51+
$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
5252

5353
if (!$this->managerRegistry->getManagerForClass($entityClass) instanceof EntityManagerInterface) {
5454
continue;
@@ -64,10 +64,7 @@ public function create(string $resourceClass): ResourceMetadataCollection
6464

6565
if ($graphQlOperations) {
6666
foreach ($graphQlOperations as $operationName => $graphQlOperation) {
67-
$entityClass = $graphQlOperation->getClass();
68-
if (($options = $graphQlOperation->getStateOptions()) && $options instanceof Options && $options->getEntityClass()) {
69-
$entityClass = $options->getEntityClass();
70-
}
67+
$entityClass = $this->getStateOptionsClass($graphQlOperation, $graphQlOperation->getClass(), Options::class);
7168

7269
if (!$this->managerRegistry->getManagerForClass($entityClass) instanceof EntityManagerInterface) {
7370
continue;

src/Doctrine/Orm/State/CollectionProvider.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use ApiPlatform\Metadata\Operation;
2222
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
2323
use ApiPlatform\State\ProviderInterface;
24+
use ApiPlatform\State\Util\StateOptionsTrait;
2425
use Doctrine\ORM\EntityManagerInterface;
2526
use Doctrine\Persistence\ManagerRegistry;
2627
use Psr\Container\ContainerInterface;
@@ -35,6 +36,7 @@ final class CollectionProvider implements ProviderInterface
3536
{
3637
use LinksHandlerLocatorTrait;
3738
use LinksHandlerTrait;
39+
use StateOptionsTrait;
3840

3941
/**
4042
* @param QueryCollectionExtensionInterface[] $collectionExtensions
@@ -48,10 +50,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource
4850

4951
public function provide(Operation $operation, array $uriVariables = [], array $context = []): iterable
5052
{
51-
$entityClass = $operation->getClass();
52-
if (($options = $operation->getStateOptions()) && $options instanceof Options && $options->getEntityClass()) {
53-
$entityClass = $options->getEntityClass();
54-
}
53+
$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
5554

5655
/** @var EntityManagerInterface $manager */
5756
$manager = $this->managerRegistry->getManagerForClass($entityClass);

src/Doctrine/Orm/State/ItemProvider.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use ApiPlatform\Metadata\Operation;
2222
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
2323
use ApiPlatform\State\ProviderInterface;
24+
use ApiPlatform\State\Util\StateOptionsTrait;
2425
use Doctrine\ORM\EntityManagerInterface;
2526
use Doctrine\Persistence\ManagerRegistry;
2627
use Psr\Container\ContainerInterface;
@@ -35,6 +36,7 @@ final class ItemProvider implements ProviderInterface
3536
{
3637
use LinksHandlerLocatorTrait;
3738
use LinksHandlerTrait;
39+
use StateOptionsTrait;
3840

3941
/**
4042
* @param QueryItemExtensionInterface[] $itemExtensions
@@ -48,10 +50,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource
4850

4951
public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?object
5052
{
51-
$entityClass = $operation->getClass();
52-
if (($options = $operation->getStateOptions()) && $options instanceof Options && $options->getEntityClass()) {
53-
$entityClass = $options->getEntityClass();
54-
}
53+
$entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
5554

5655
/** @var EntityManagerInterface|null $manager */
5756
$manager = $this->managerRegistry->getManagerForClass($entityClass);

src/Doctrine/Orm/State/LinksHandlerTrait.php

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
1818
use ApiPlatform\Metadata\Link;
1919
use ApiPlatform\Metadata\Operation;
20+
use ApiPlatform\State\Util\StateOptionsTrait;
2021
use Doctrine\ORM\Mapping\ClassMetadata;
2122
use Doctrine\ORM\QueryBuilder;
2223
use Doctrine\Persistence\ManagerRegistry;
@@ -27,6 +28,7 @@
2728
trait LinksHandlerTrait
2829
{
2930
use CommonLinksHandlerTrait;
31+
use StateOptionsTrait;
3032

3133
private ManagerRegistry $managerRegistry;
3234

@@ -159,25 +161,12 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que
159161
private function getLinkFromClass(Link $link, Operation $operation): string
160162
{
161163
$fromClass = $link->getFromClass();
162-
if ($fromClass === $operation->getClass() && $entityClass = $this->getStateOptionsEntityClass($operation)) {
164+
if ($fromClass === $operation->getClass() && $entityClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class)) {
163165
return $entityClass;
164166
}
165167

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

168-
if ($entityClass = $this->getStateOptionsEntityClass($operation)) {
169-
return $entityClass;
170-
}
171-
172-
throw new \Exception('Can not found a doctrine class for this link.');
173-
}
174-
175-
private function getStateOptionsEntityClass(Operation $operation): ?string
176-
{
177-
if (($options = $operation->getStateOptions()) && $options instanceof Options && $entityClass = $options->getEntityClass()) {
178-
return $entityClass;
179-
}
180-
181-
return null;
170+
return $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
182171
}
183172
}

src/GraphQl/Type/FieldsBuilder.php

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313

1414
namespace ApiPlatform\GraphQl\Type;
1515

16-
use ApiPlatform\Doctrine\Odm\State\Options as ODMOptions;
17-
use ApiPlatform\Doctrine\Orm\State\Options;
1816
use ApiPlatform\GraphQl\Exception\InvalidTypeException;
1917
use ApiPlatform\GraphQl\Resolver\Factory\ResolverFactoryInterface;
2018
use ApiPlatform\GraphQl\Type\Definition\TypeInterface;
@@ -563,18 +561,7 @@ private function getFilterArgs(array $args, ?string $resourceClass, string $root
563561
continue;
564562
}
565563

566-
$entityClass = $resourceClass;
567-
if ($options = $resourceOperation->getStateOptions()) {
568-
if (class_exists(Options::class) && $options instanceof Options && $options->getEntityClass()) {
569-
$entityClass = $options->getEntityClass();
570-
}
571-
572-
if (class_exists(ODMOptions::class) && $options instanceof ODMOptions && $options->getDocumentClass()) {
573-
$entityClass = $options->getDocumentClass();
574-
}
575-
}
576-
577-
foreach ($this->filterLocator->get($filterId)->getDescription($entityClass) as $key => $description) {
564+
foreach ($this->filterLocator->get($filterId)->getDescription($resourceClass) as $key => $description) {
578565
$nullable = isset($description['required']) ? !$description['required'] : true;
579566
$filterType = \in_array($description['type'], Type::$builtinTypes, true) ? new Type($description['type'], $nullable) : new Type('object', $nullable, $description['type']);
580567
$graphqlFilterType = $this->convertType($filterType, false, $resourceOperation, $rootOperation, $resourceClass, $rootResource, $property, $depth);

src/Hydra/Serializer/CollectionFiltersNormalizer.php

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,13 @@
1313

1414
namespace ApiPlatform\Hydra\Serializer;
1515

16-
use ApiPlatform\Doctrine\Odm\State\Options as ODMOptions;
17-
use ApiPlatform\Doctrine\Orm\State\Options;
1816
use ApiPlatform\JsonLd\Serializer\HydraPrefixTrait;
1917
use ApiPlatform\Metadata\FilterInterface;
2018
use ApiPlatform\Metadata\Parameters;
2119
use ApiPlatform\Metadata\QueryParameterInterface;
2220
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
2321
use ApiPlatform\Metadata\ResourceClassResolverInterface;
22+
use ApiPlatform\State\Util\StateOptionsTrait;
2423
use Psr\Container\ContainerInterface;
2524
use Symfony\Component\Serializer\Exception\UnexpectedValueException;
2625
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
@@ -35,6 +34,7 @@
3534
final class CollectionFiltersNormalizer implements NormalizerInterface, NormalizerAwareInterface
3635
{
3736
use HydraPrefixTrait;
37+
use StateOptionsTrait;
3838
private ?ContainerInterface $filterLocator = null;
3939

4040
/**
@@ -101,15 +101,7 @@ public function normalize(mixed $object, ?string $format = null, array $context
101101
}
102102
}
103103

104-
if ($options = $operation->getStateOptions()) {
105-
if ($options instanceof Options && $options->getEntityClass()) {
106-
$resourceClass = $options->getEntityClass();
107-
}
108-
109-
if ($options instanceof ODMOptions && $options->getDocumentClass()) {
110-
$resourceClass = $options->getDocumentClass();
111-
}
112-
}
104+
$resourceClass = $this->getStateOptionsClass($operation, $resourceClass);
113105

114106
if ($currentFilters || ($parameters && \count($parameters))) {
115107
$hydraPrefix = $this->getHydraPrefix($context + $this->defaultContext);

src/Laravel/Eloquent/State/CollectionProvider.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use ApiPlatform\Metadata\Operation;
2121
use ApiPlatform\State\Pagination\Pagination;
2222
use ApiPlatform\State\ProviderInterface;
23+
use ApiPlatform\State\Util\StateOptionsTrait;
2324
use Illuminate\Database\Eloquent\Collection;
2425
use Illuminate\Database\Eloquent\Model;
2526
use Psr\Container\ContainerInterface;
@@ -30,7 +31,7 @@
3031
final class CollectionProvider implements ProviderInterface
3132
{
3233
use LinksHandlerLocatorTrait;
33-
use ModelClassTrait;
34+
use StateOptionsTrait;
3435

3536
/**
3637
* @param LinksHandlerInterface<Model> $linksHandler
@@ -47,7 +48,7 @@ public function __construct(
4748

4849
public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
4950
{
50-
$resourceClass = $this->getModelClass($operation);
51+
$resourceClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
5152
$model = new $resourceClass();
5253

5354
if (!$model instanceof Model) {

src/Laravel/Eloquent/State/ItemProvider.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use ApiPlatform\Metadata\Exception\RuntimeException;
1818
use ApiPlatform\Metadata\Operation;
1919
use ApiPlatform\State\ProviderInterface;
20+
use ApiPlatform\State\Util\StateOptionsTrait;
2021
use Illuminate\Database\Eloquent\Model;
2122
use Psr\Container\ContainerInterface;
2223

@@ -26,7 +27,7 @@
2627
final class ItemProvider implements ProviderInterface
2728
{
2829
use LinksHandlerLocatorTrait;
29-
use ModelClassTrait;
30+
use StateOptionsTrait;
3031

3132
/**
3233
* @param LinksHandlerInterface<Model> $linksHandler
@@ -42,7 +43,7 @@ public function __construct(
4243

4344
public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
4445
{
45-
$resourceClass = $this->getModelClass($operation);
46+
$resourceClass = $this->getStateOptionsClass($operation, $operation->getClass(), Options::class);
4647
$model = new $resourceClass();
4748

4849
if (!$model instanceof Model) {

0 commit comments

Comments
 (0)