Skip to content

Commit 3fdd546

Browse files
authored
Merge pull request #1850 from api-platform/2.2
Merge 2.2
2 parents 3d17f85 + d611aa0 commit 3fdd546

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

src/Bridge/Symfony/Routing/ApiLoader.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,18 @@ public function load($data, $type = null): RouteCollection
107107
}
108108

109109
foreach ($this->subresourceOperationFactory->create($resourceClass) as $operationId => $operation) {
110+
if (null === $controller = $operation['controller'] ?? null) {
111+
$controller = self::DEFAULT_ACTION_PATTERN.'get_subresource';
112+
113+
if (!$this->container->has($controller)) {
114+
throw new RuntimeException(sprintf('There is no builtin action for the %s %s operation. You need to define the controller yourself.', OperationType::SUBRESOURCE, 'GET'));
115+
}
116+
}
117+
110118
$routeCollection->add($operation['route_name'], new Route(
111119
$operation['path'],
112120
[
113-
'_controller' => self::DEFAULT_ACTION_PATTERN.'get_subresource',
121+
'_controller' => $controller,
114122
'_format' => null,
115123
'_api_resource_class' => $operation['resource_class'],
116124
'_api_subresource_operation_name' => $operation['route_name'],

src/Operation/Factory/SubresourceOperationFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ final class SubresourceOperationFactory implements SubresourceOperationFactoryIn
2626
{
2727
const SUBRESOURCE_SUFFIX = '_subresource';
2828
const FORMAT_SUFFIX = '.{_format}';
29-
const ROUTE_OPTIONS = ['defaults' => [], 'requirements' => [], 'options' => [], 'host' => '', 'schemes' => [], 'condition' => ''];
29+
const ROUTE_OPTIONS = ['defaults' => [], 'requirements' => [], 'options' => [], 'host' => '', 'schemes' => [], 'condition' => '', 'controller' => null];
3030

3131
private $resourceMetadataFactory;
3232
private $propertyNameCollectionFactory;

tests/Bridge/Symfony/Routing/ApiLoaderTest.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ public function testRecursiveSubresource()
200200
);
201201

202202
$this->assertEquals(
203-
$this->getSubresourceRoute('/related_dummies/{id}/recursivesubresource.{_format}', 'api_platform.action.get_subresource', DummyEntity::class, 'api_related_dummies_recursivesubresource_get_subresource', ['property' => 'recursivesubresource', 'identifiers' => [['id', RelatedDummyEntity::class, true]], 'collection' => false, 'operationId' => 'api_related_dummies_recursivesubresource_get_subresource']),
203+
$this->getSubresourceRoute('/related_dummies/{id}/recursivesubresource.{_format}', 'dummy_controller', DummyEntity::class, 'api_related_dummies_recursivesubresource_get_subresource', ['property' => 'recursivesubresource', 'identifiers' => [['id', RelatedDummyEntity::class, true]], 'collection' => false, 'operationId' => 'api_related_dummies_recursivesubresource_get_subresource']),
204204
$routeCollection->get('api_related_dummies_recursivesubresource_get_subresource')
205205
);
206206

@@ -232,6 +232,7 @@ private function getApiLoaderWithResourceMetadata(ResourceMetadata $resourceMeta
232232
'api_platform.action.get_item',
233233
'api_platform.action.put_item',
234234
'api_platform.action.delete_item',
235+
'api_platform.action.get_subresource',
235236
];
236237
$containerProphecy = $this->prophesize(ContainerInterface::class);
237238

@@ -244,7 +245,14 @@ private function getApiLoaderWithResourceMetadata(ResourceMetadata $resourceMeta
244245

245246
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
246247
$resourceMetadataFactoryProphecy->create(DummyEntity::class)->willReturn($resourceMetadata);
247-
$resourceMetadataFactoryProphecy->create(RelatedDummyEntity::class)->willReturn((new ResourceMetadata())->withShortName('related_dummies'));
248+
249+
$relatedDummyEntityMetadata = (new ResourceMetadata())->withShortName('related_dummies')->withSubresourceOperations([
250+
'recursivesubresource_get_subresource' => [
251+
'controller' => 'dummy_controller',
252+
],
253+
]);
254+
255+
$resourceMetadataFactoryProphecy->create(RelatedDummyEntity::class)->willReturn($relatedDummyEntityMetadata);
248256

249257
$resourceNameCollectionFactoryProphecy = $this->prophesize(ResourceNameCollectionFactoryInterface::class);
250258
$resourceNameCollectionFactoryProphecy->create()->willReturn(new ResourceNameCollection([DummyEntity::class, RelatedDummyEntity::class]));

0 commit comments

Comments
 (0)