Skip to content

Commit 7b46eec

Browse files
committed
fix(symfony): api_platform_iris loader misses item Gets and api_genid
| Q | A | ------------- | --- | Branch? | 4.3 | Tickets | #7915 | License | MIT | Doc PR | ∅ In iris mode, register every item HTTP operation (not just NotExposed) forcing the api_platform.action.not_exposed controller so the IriConverter can resolve routes while hitting any URL still 404s. Also load genid.php so skolem IRIs keep working for non-resource objects.
1 parent fffcb25 commit 7b46eec

2 files changed

Lines changed: 17 additions & 6 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: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,23 +258,26 @@ 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}'),
267-
'api_dummies_not_exposed_item' => (new NotExposed())->withUriTemplate('/dummies/{id}{._format}'),
267+
'api_dummies_not_exposed_item' => (new NotExposed())->withUriTemplate('/dummies/by_uuid/{uuid}{._format}'),
268268
])),
269269
]);
270270

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

273-
$this->assertNull($routeCollection->get('api_dummies_get_item'));
274-
$this->assertNull($routeCollection->get('api_dummies_get_collection'));
273+
$itemRoute = $routeCollection->get('api_dummies_get_item');
274+
$this->assertNotNull($itemRoute);
275+
$this->assertSame('api_platform.action.not_exposed', $itemRoute->getDefault('_controller'));
275276
$this->assertNotNull($routeCollection->get('api_dummies_not_exposed_item'));
277+
$this->assertNull($routeCollection->get('api_dummies_get_collection'));
276278
$this->assertNull($routeCollection->get('api_jsonld_context'));
277279
$this->assertNull($routeCollection->get('api_entrypoint'));
280+
$this->assertNotNull($routeCollection->get('api_genid'));
278281
}
279282

280283
public function testApiLoaderWithUndefinedControllerService(): void

0 commit comments

Comments
 (0)