Skip to content

Commit d34fba5

Browse files
authored
Merge pull request #1830 from jeffreymb/issue_1828
Implement ability to define the controller for a subresource
2 parents 0b3e937 + b514300 commit d34fba5

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
@@ -106,10 +106,18 @@ public function load($data, $type = null): RouteCollection
106106
}
107107

108108
foreach ($this->subresourceOperationFactory->create($resourceClass) as $operationId => $operation) {
109+
if (null === $controller = $operation['controller'] ?? null) {
110+
$controller = self::DEFAULT_ACTION_PATTERN.'get_subresource';
111+
112+
if (!$this->container->has($controller)) {
113+
throw new RuntimeException(sprintf('There is no builtin action for the %s %s operation. You need to define the controller yourself.', OperationType::SUBRESOURCE, 'GET'));
114+
}
115+
}
116+
109117
$routeCollection->add($operation['route_name'], new Route(
110118
$operation['path'],
111119
[
112-
'_controller' => self::DEFAULT_ACTION_PATTERN.'get_subresource',
120+
'_controller' => $controller,
113121
'_format' => null,
114122
'_api_resource_class' => $operation['resource_class'],
115123
'_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
@@ -171,7 +171,7 @@ public function testRecursiveSubresource()
171171
);
172172

173173
$this->assertEquals(
174-
$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']),
174+
$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']),
175175
$routeCollection->get('api_related_dummies_recursivesubresource_get_subresource')
176176
);
177177

@@ -203,6 +203,7 @@ private function getApiLoaderWithResourceMetadata(ResourceMetadata $resourceMeta
203203
'api_platform.action.get_item',
204204
'api_platform.action.put_item',
205205
'api_platform.action.delete_item',
206+
'api_platform.action.get_subresource',
206207
];
207208
$containerProphecy = $this->prophesize(ContainerInterface::class);
208209

@@ -215,7 +216,14 @@ private function getApiLoaderWithResourceMetadata(ResourceMetadata $resourceMeta
215216

216217
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
217218
$resourceMetadataFactoryProphecy->create(DummyEntity::class)->willReturn($resourceMetadata);
218-
$resourceMetadataFactoryProphecy->create(RelatedDummyEntity::class)->willReturn((new ResourceMetadata())->withShortName('related_dummies'));
219+
220+
$relatedDummyEntityMetadata = (new ResourceMetadata())->withShortName('related_dummies')->withSubresourceOperations([
221+
'recursivesubresource_get_subresource' => [
222+
'controller' => 'dummy_controller',
223+
],
224+
]);
225+
226+
$resourceMetadataFactoryProphecy->create(RelatedDummyEntity::class)->willReturn($relatedDummyEntityMetadata);
219227

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

0 commit comments

Comments
 (0)