Skip to content

Commit 14d5e82

Browse files
authored
fix(symfony): api_platform_iris loader misses item Gets and api_genid (#7946)
1 parent 173dc66 commit 14d5e82

2 files changed

Lines changed: 18 additions & 5 deletions

File tree

src/Symfony/Routing/ApiLoader.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313

1414
namespace ApiPlatform\Symfony\Routing;
1515

16+
use ApiPlatform\Metadata\CollectionOperationInterface;
1617
use ApiPlatform\Metadata\Exception\RuntimeException;
18+
use ApiPlatform\Metadata\HttpOperation;
1719
use ApiPlatform\Metadata\NotExposed;
1820
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
1921
use ApiPlatform\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface;
@@ -58,15 +60,21 @@ public function load(mixed $data, ?string $type = null): RouteCollection
5860
$routeCollection->addResource(new DirectoryResource($directory, '/\.php$/'));
5961
}
6062

61-
if (!$notExposedOnly) {
63+
if ($notExposedOnly) {
64+
$routeCollection->addCollection($this->fileLoader->load('genid.php'));
65+
} else {
6266
$this->loadExternalFiles($routeCollection);
6367
}
6468

6569
foreach ($this->resourceNameCollectionFactory->create() as $resourceClass) {
6670
foreach ($this->resourceMetadataFactory->create($resourceClass) as $resourceMetadata) {
6771
foreach ($resourceMetadata->getOperations() as $operationName => $operation) {
6872
if ($notExposedOnly && !$operation instanceof NotExposed) {
69-
continue;
73+
if ($operation instanceof CollectionOperationInterface || !$operation instanceof HttpOperation) {
74+
continue;
75+
}
76+
77+
$operation = $operation->withController('api_platform.action.not_exposed');
7078
}
7179

7280
if ($operation->getOpenapi() instanceof Webhook) {

tests/Symfony/Routing/ApiLoaderTest.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,23 +258,28 @@ public function testApiLoaderWithPrefix(): void
258258
);
259259
}
260260

261-
public function testApiLoaderIrisTypeOnlyEmitsNotExposedRoutes(): void
261+
public function testApiLoaderIrisTypeRegistersItemRoutesWithNotExposedController(): void
262262
{
263263
$resourceCollection = new ResourceMetadataCollection(Dummy::class, [
264264
(new ApiResource())->withShortName('dummy')->withOperations(new Operations([
265265
'api_dummies_get_item' => (new Get())->withUriTemplate('/dummies/{id}{._format}')->withController('api_platform.action.get_item'),
266266
'api_dummies_get_collection' => (new GetCollection())->withUriTemplate('/dummies{._format}'),
267267
'api_dummies_not_exposed_item' => (new NotExposed())->withUriTemplate('/dummies/{id}{._format}'),
268+
'api_dummies_not_exposed_by_uuid_item' => (new NotExposed())->withUriTemplate('/dummies/by_uuid/{uuid}{._format}'),
268269
])),
269270
]);
270271

271272
$routeCollection = $this->getApiLoaderWithResourceMetadataCollection($resourceCollection)->load(null, ApiLoader::TYPE_IRIS);
272273

273-
$this->assertNull($routeCollection->get('api_dummies_get_item'));
274-
$this->assertNull($routeCollection->get('api_dummies_get_collection'));
274+
$itemRoute = $routeCollection->get('api_dummies_get_item');
275+
$this->assertNotNull($itemRoute);
276+
$this->assertSame('api_platform.action.not_exposed', $itemRoute->getDefault('_controller'));
275277
$this->assertNotNull($routeCollection->get('api_dummies_not_exposed_item'));
278+
$this->assertNotNull($routeCollection->get('api_dummies_not_exposed_by_uuid_item'));
279+
$this->assertNull($routeCollection->get('api_dummies_get_collection'));
276280
$this->assertNull($routeCollection->get('api_jsonld_context'));
277281
$this->assertNull($routeCollection->get('api_entrypoint'));
282+
$this->assertNotNull($routeCollection->get('api_genid'));
278283
}
279284

280285
public function testApiLoaderWithUndefinedControllerService(): void

0 commit comments

Comments
 (0)