Skip to content

Commit 12c4209

Browse files
authored
feat(metadata): ability to hide an hydra class/operation (#6871)
1 parent be98f4e commit 12c4209

22 files changed

+173
-1
lines changed

src/Hydra/Serializer/DocumentationNormalizer.php

+8
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ public function normalize(mixed $object, ?string $format = null, array $context
7575
continue;
7676
}
7777

78+
if (true === $resourceMetadata->getHideHydraOperation()) {
79+
continue;
80+
}
81+
7882
$shortName = $resourceMetadata->getShortName();
7983

8084
$prefixedShortName = $resourceMetadata->getTypes()[0] ?? "#$shortName";
@@ -243,6 +247,10 @@ private function getHydraOperations(bool $collection, ?ResourceMetadataCollectio
243247
$hydraOperations = [];
244248
foreach ($resourceMetadataCollection as $resourceMetadata) {
245249
foreach ($resourceMetadata->getOperations() as $operation) {
250+
if (true === $operation->getHideHydraOperation()) {
251+
continue;
252+
}
253+
246254
if (('POST' === $operation->getMethod() || $operation instanceof CollectionOperationInterface) !== $collection) {
247255
continue;
248256
}

src/Hydra/Serializer/EntrypointNormalizer.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public function normalize(mixed $object, ?string $format = null, array $context
5656

5757
foreach ($resource->getOperations() as $operation) {
5858
$key = lcfirst($resource->getShortName());
59-
if (!$operation instanceof CollectionOperationInterface || isset($entrypoint[$key])) {
59+
if (true === $operation->getHideHydraOperation() || !$operation instanceof CollectionOperationInterface || isset($entrypoint[$key])) {
6060
continue;
6161
}
6262

src/Metadata/ApiResource.php

+2
Original file line numberDiff line numberDiff line change
@@ -964,6 +964,7 @@ public function __construct(
964964
array|string|null $middleware = null,
965965
array|Parameters|null $parameters = null,
966966
protected ?bool $strictQueryParameterValidation = null,
967+
protected ?bool $hideHydraOperation = null,
967968
protected array $extraProperties = [],
968969
) {
969970
parent::__construct(
@@ -1009,6 +1010,7 @@ class: $class,
10091010
policy: $policy,
10101011
middleware: $middleware,
10111012
strictQueryParameterValidation: $strictQueryParameterValidation,
1013+
hideHydraOperation: $hideHydraOperation,
10121014
extraProperties: $extraProperties
10131015
);
10141016

src/Metadata/Delete.php

+2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ public function __construct(
9999
?string $policy = null,
100100
array|string|null $middleware = null,
101101
?bool $strictQueryParameterValidation = null,
102+
protected ?bool $hideHydraOperation = null,
102103
array $extraProperties = [],
103104
) {
104105
parent::__construct(
@@ -180,6 +181,7 @@ class: $class,
180181
collectDenormalizationErrors: $collectDenormalizationErrors,
181182
parameters: $parameters,
182183
strictQueryParameterValidation: $strictQueryParameterValidation,
184+
hideHydraOperation: $hideHydraOperation,
183185
stateOptions: $stateOptions,
184186
);
185187
}

src/Metadata/Extractor/XmlResourceExtractor.php

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ private function buildExtendedBase(\SimpleXMLElement $resource): array
9595
'exceptionToStatus' => $this->buildExceptionToStatus($resource),
9696
'queryParameterValidationEnabled' => $this->phpize($resource, 'queryParameterValidationEnabled', 'bool'),
9797
'strictQueryParameterValidation' => $this->phpize($resource, 'strictQueryParameterValidation', 'bool'),
98+
'hideHydraOperation' => $this->phpize($resource, 'hideHydraOperation', 'bool'),
9899
'stateOptions' => $this->buildStateOptions($resource),
99100
'links' => $this->buildLinks($resource),
100101
'headers' => $this->buildHeaders($resource),

src/Metadata/Extractor/YamlResourceExtractor.php

+1
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ private function buildOperations(array $resource, array $root): ?array
339339
'serialize' => $this->phpize($operation, 'serialize', 'bool'),
340340
'queryParameterValidate' => $this->phpize($operation, 'queryParameterValidate', 'bool'),
341341
'strictQueryParameterValidation' => $this->phpize($operation, 'strictQueryParameterValidation', 'bool'),
342+
'hideHydraOperation' => $this->phpize($resource, 'hideHydraOperation', 'bool'),
342343
'priority' => $this->phpize($operation, 'priority', 'integer'),
343344
'name' => $this->phpize($operation, 'name', 'string'),
344345
'class' => (string) $class,

src/Metadata/Extractor/schema/resources.xsd

+1
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@
516516
<xsd:attributeGroup name="extendedBase">
517517
<xsd:attributeGroup ref="base"/>
518518
<xsd:attribute type="xsd:boolean" name="strictQueryParameterValidation"/>
519+
<xsd:attribute type="xsd:boolean" name="hideHydraOperation"/>
519520
<xsd:attribute type="xsd:boolean" name="queryParameterValidationEnabled"/>
520521
<xsd:attribute type="xsd:string" name="routePrefix"/>
521522
<xsd:attribute type="xsd:boolean" name="stateless"/>

src/Metadata/Get.php

+2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ public function __construct(
9999
?string $policy = null,
100100
array|string|null $middleware = null,
101101
?bool $strictQueryParameterValidation = null,
102+
protected ?bool $hideHydraOperation = null,
102103
array $extraProperties = [],
103104
) {
104105
parent::__construct(
@@ -179,6 +180,7 @@ class: $class,
179180
policy: $policy,
180181
middleware: $middleware,
181182
strictQueryParameterValidation: $strictQueryParameterValidation,
183+
hideHydraOperation: $hideHydraOperation,
182184
extraProperties: $extraProperties,
183185
);
184186
}

src/Metadata/GetCollection.php

+2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ public function __construct(
9999
?string $policy = null,
100100
array|string|null $middleware = null,
101101
?bool $strictQueryParameterValidation = null,
102+
protected ?bool $hideHydraOperation = null,
102103
array $extraProperties = [],
103104
private ?string $itemUriTemplate = null,
104105
) {
@@ -180,6 +181,7 @@ class: $class,
180181
policy: $policy,
181182
middleware: $middleware,
182183
strictQueryParameterValidation: $strictQueryParameterValidation,
184+
hideHydraOperation: $hideHydraOperation,
183185
stateOptions: $stateOptions,
184186
);
185187
}

src/Metadata/HttpOperation.php

+2
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ public function __construct(
156156
protected ?array $links = null,
157157
protected ?array $errors = null,
158158
protected ?bool $strictQueryParameterValidation = null,
159+
protected ?bool $hideHydraOperation = null,
159160

160161
?string $shortName = null,
161162
?string $class = null,
@@ -259,6 +260,7 @@ class: $class,
259260
middleware: $middleware,
260261
queryParameterValidationEnabled: $queryParameterValidationEnabled,
261262
strictQueryParameterValidation: $strictQueryParameterValidation,
263+
hideHydraOperation: $hideHydraOperation,
262264
extraProperties: $extraProperties
263265
);
264266
}

src/Metadata/Metadata.php

+14
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public function __construct(
8282
protected array|string|null $middleware = null,
8383
protected ?bool $queryParameterValidationEnabled = null,
8484
protected ?bool $strictQueryParameterValidation = null,
85+
protected ?bool $hideHydraOperation = null,
8586
protected array $extraProperties = [],
8687
) {
8788
if (\is_array($parameters) && $parameters) {
@@ -680,4 +681,17 @@ public function withStrictQueryParameterValidation(bool $strictQueryParameterVal
680681

681682
return $self;
682683
}
684+
685+
public function getHideHydraOperation(): ?bool
686+
{
687+
return $this->hideHydraOperation;
688+
}
689+
690+
public function withHideHydraOperation(bool $hideHydraOperation): static
691+
{
692+
$self = clone $this;
693+
$self->hideHydraOperation = $hideHydraOperation;
694+
695+
return $self;
696+
}
683697
}

src/Metadata/Operation.php

+2
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,7 @@ public function __construct(
812812
array|string|null $middleware = null,
813813
?bool $queryParameterValidationEnabled = null,
814814
protected ?bool $strictQueryParameterValidation = null,
815+
protected ?bool $hideHydraOperation = null,
815816
protected array $extraProperties = [],
816817
) {
817818
parent::__construct(
@@ -858,6 +859,7 @@ class: $class,
858859
middleware: $middleware,
859860
queryParameterValidationEnabled: $queryParameterValidationEnabled,
860861
strictQueryParameterValidation: $strictQueryParameterValidation,
862+
hideHydraOperation: $hideHydraOperation,
861863
extraProperties: $extraProperties,
862864
);
863865
}

src/Metadata/Patch.php

+2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ public function __construct(
9999
?string $policy = null,
100100
array|string|null $middleware = null,
101101
?bool $strictQueryParameterValidation = null,
102+
?bool $hideHydraOperation = null,
102103
array $extraProperties = [],
103104
) {
104105
parent::__construct(
@@ -180,6 +181,7 @@ class: $class,
180181
policy: $policy,
181182
middleware: $middleware,
182183
strictQueryParameterValidation: $strictQueryParameterValidation,
184+
hideHydraOperation: $hideHydraOperation,
183185
extraProperties: $extraProperties
184186
);
185187
}

src/Metadata/Post.php

+2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public function __construct(
101101
array $extraProperties = [],
102102
private ?string $itemUriTemplate = null,
103103
?bool $strictQueryParameterValidation = null,
104+
?bool $hideHydraOperation = null,
104105
) {
105106
parent::__construct(
106107
method: 'POST',
@@ -181,6 +182,7 @@ class: $class,
181182
policy: $policy,
182183
middleware: $middleware,
183184
strictQueryParameterValidation: $strictQueryParameterValidation,
185+
hideHydraOperation: $hideHydraOperation,
184186
extraProperties: $extraProperties
185187
);
186188
}

src/Metadata/Put.php

+2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ public function __construct(
100100
array|string|null $middleware = null,
101101
array $extraProperties = [],
102102
?bool $strictQueryParameterValidation = null,
103+
?bool $hideHydraOperation = null,
103104
private ?bool $allowCreate = null,
104105
) {
105106
parent::__construct(
@@ -181,6 +182,7 @@ class: $class,
181182
policy: $policy,
182183
middleware: $middleware,
183184
strictQueryParameterValidation: $strictQueryParameterValidation,
185+
hideHydraOperation: $hideHydraOperation,
184186
extraProperties: $extraProperties
185187
);
186188
}

src/Metadata/Tests/Extractor/Adapter/XmlResourceAdapter.php

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ final class XmlResourceAdapter implements ResourceAdapterInterface
6363
'securityPostValidationMessage',
6464
'queryParameterValidationEnabled',
6565
'strictQueryParameterValidation',
66+
'hideHydraOperation',
6667
'stateOptions',
6768
'collectDenormalizationErrors',
6869
'links',

src/Metadata/Tests/Extractor/ResourceMetadataCompatibilityTest.php

+3
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ final class ResourceMetadataCompatibilityTest extends TestCase
9797
'securityPostValidationMessage' => 'Sorry, you must the owner of this resource to access it.',
9898
'queryParameterValidationEnabled' => true,
9999
'strictQueryParameterValidation' => false,
100+
'hideHydraOperation' => false,
100101
'types' => ['someirischema', 'anotheririschema'],
101102
'formats' => [
102103
'json' => null,
@@ -401,6 +402,7 @@ final class ResourceMetadataCompatibilityTest extends TestCase
401402
],
402403
'queryParameterValidationEnabled' => false,
403404
'strictQueryParameterValidation' => false,
405+
'hideHydraOperation' => false,
404406
'read' => true,
405407
'deserialize' => false,
406408
'validate' => false,
@@ -489,6 +491,7 @@ final class ResourceMetadataCompatibilityTest extends TestCase
489491
'controller',
490492
'queryParameterValidationEnabled',
491493
'strictQueryParameterValidation',
494+
'hideHydraOperation',
492495
'exceptionToStatus',
493496
'types',
494497
'formats',

src/Metadata/Tests/Extractor/XmlExtractorTest.php

+4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public function testValidXML(): void
6767
'securityPostValidationMessage' => null,
6868
'queryParameterValidationEnabled' => null,
6969
'strictQueryParameterValidation' => null,
70+
'hideHydraOperation' => null,
7071
'input' => null,
7172
'output' => null,
7273
'types' => null,
@@ -138,6 +139,7 @@ public function testValidXML(): void
138139
'securityPostValidationMessage' => null,
139140
'queryParameterValidationEnabled' => null,
140141
'strictQueryParameterValidation' => null,
142+
'hideHydraOperation' => null,
141143
'input' => null,
142144
'output' => null,
143145
'types' => ['someirischema', 'anotheririschema'],
@@ -267,6 +269,7 @@ public function testValidXML(): void
267269
'serialize' => null,
268270
'queryParameterValidate' => null,
269271
'strictQueryParameterValidation' => null,
272+
'hideHydraOperation' => null,
270273
'collection' => null,
271274
'method' => null,
272275
'priority' => null,
@@ -371,6 +374,7 @@ public function testValidXML(): void
371374
'serialize' => null,
372375
'queryParameterValidate' => null,
373376
'strictQueryParameterValidation' => null,
377+
'hideHydraOperation' => null,
374378
'collection' => null,
375379
'method' => null,
376380
'priority' => null,

src/Metadata/Tests/Extractor/YamlExtractorTest.php

+2
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ public function testValidYaml(): void
275275
'securityPostValidationMessage' => null,
276276
'queryParameterValidationEnabled' => null,
277277
'strictQueryParameterValidation' => null,
278+
'hideHydraOperation' => null,
278279
'input' => null,
279280
'output' => null,
280281
'types' => ['someirischema'],
@@ -355,6 +356,7 @@ public function testValidYaml(): void
355356
'securityPostValidationMessage' => null,
356357
'queryParameterValidationEnabled' => null,
357358
'strictQueryParameterValidation' => null,
359+
'hideHydraOperation' => null,
358360
'input' => null,
359361
'output' => null,
360362
'types' => ['anotheririschema'],
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace ApiPlatform\Tests\Fixtures\TestBundle\ApiResource;
15+
16+
use ApiPlatform\Metadata\ApiResource;
17+
use ApiPlatform\Metadata\Get;
18+
use ApiPlatform\Metadata\GetCollection;
19+
20+
#[ApiResource(
21+
hideHydraOperation: true,
22+
normalizationContext: ['hydra_prefix' => false],
23+
operations: [
24+
new Get(),
25+
new GetCollection(),
26+
]
27+
)]
28+
final class HideHydraClass
29+
{
30+
public function __construct(public string $id, public string $title)
31+
{
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace ApiPlatform\Tests\Fixtures\TestBundle\ApiResource;
15+
16+
use ApiPlatform\Metadata\ApiResource;
17+
use ApiPlatform\Metadata\Get;
18+
use ApiPlatform\Metadata\GetCollection;
19+
20+
#[ApiResource(
21+
normalizationContext: ['hydra_prefix' => false],
22+
operations: [
23+
new Get(hideHydraOperation: true),
24+
new GetCollection(hideHydraOperation: true),
25+
]
26+
)]
27+
final class HideHydraOperation
28+
{
29+
public function __construct(public string $id, public string $title)
30+
{
31+
}
32+
}

0 commit comments

Comments
 (0)