Skip to content

Commit

Permalink
Merge pull request #1850 from api-platform/2.2
Browse files Browse the repository at this point in the history
Merge 2.2
  • Loading branch information
soyuka committed Apr 12, 2018
2 parents 3d17f85 + d611aa0 commit 3fdd546
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 4 deletions.
10 changes: 9 additions & 1 deletion src/Bridge/Symfony/Routing/ApiLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,18 @@ public function load($data, $type = null): RouteCollection
}

foreach ($this->subresourceOperationFactory->create($resourceClass) as $operationId => $operation) {
if (null === $controller = $operation['controller'] ?? null) {
$controller = self::DEFAULT_ACTION_PATTERN.'get_subresource';

if (!$this->container->has($controller)) {
throw new RuntimeException(sprintf('There is no builtin action for the %s %s operation. You need to define the controller yourself.', OperationType::SUBRESOURCE, 'GET'));
}
}

$routeCollection->add($operation['route_name'], new Route(
$operation['path'],
[
'_controller' => self::DEFAULT_ACTION_PATTERN.'get_subresource',
'_controller' => $controller,
'_format' => null,
'_api_resource_class' => $operation['resource_class'],
'_api_subresource_operation_name' => $operation['route_name'],
Expand Down
2 changes: 1 addition & 1 deletion src/Operation/Factory/SubresourceOperationFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ final class SubresourceOperationFactory implements SubresourceOperationFactoryIn
{
const SUBRESOURCE_SUFFIX = '_subresource';
const FORMAT_SUFFIX = '.{_format}';
const ROUTE_OPTIONS = ['defaults' => [], 'requirements' => [], 'options' => [], 'host' => '', 'schemes' => [], 'condition' => ''];
const ROUTE_OPTIONS = ['defaults' => [], 'requirements' => [], 'options' => [], 'host' => '', 'schemes' => [], 'condition' => '', 'controller' => null];

private $resourceMetadataFactory;
private $propertyNameCollectionFactory;
Expand Down
12 changes: 10 additions & 2 deletions tests/Bridge/Symfony/Routing/ApiLoaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ public function testRecursiveSubresource()
);

$this->assertEquals(
$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']),
$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']),
$routeCollection->get('api_related_dummies_recursivesubresource_get_subresource')
);

Expand Down Expand Up @@ -232,6 +232,7 @@ private function getApiLoaderWithResourceMetadata(ResourceMetadata $resourceMeta
'api_platform.action.get_item',
'api_platform.action.put_item',
'api_platform.action.delete_item',
'api_platform.action.get_subresource',
];
$containerProphecy = $this->prophesize(ContainerInterface::class);

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

$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
$resourceMetadataFactoryProphecy->create(DummyEntity::class)->willReturn($resourceMetadata);
$resourceMetadataFactoryProphecy->create(RelatedDummyEntity::class)->willReturn((new ResourceMetadata())->withShortName('related_dummies'));

$relatedDummyEntityMetadata = (new ResourceMetadata())->withShortName('related_dummies')->withSubresourceOperations([
'recursivesubresource_get_subresource' => [
'controller' => 'dummy_controller',
],
]);

$resourceMetadataFactoryProphecy->create(RelatedDummyEntity::class)->willReturn($relatedDummyEntityMetadata);

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

0 comments on commit 3fdd546

Please sign in to comment.