Skip to content

Commit 14300d0

Browse files
philippecarledunglas
authored andcommitted
Add missing Symfony Routing options to operations configuration (#1472)
1 parent d3ee559 commit 14300d0

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

src/Bridge/Symfony/Routing/ApiLoader.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,12 +185,13 @@ private function addRoute(RouteCollection $routeCollection, string $resourceClas
185185
'_format' => null,
186186
'_api_resource_class' => $resourceClass,
187187
sprintf('_api_%s_operation_name', $operationType) => $operationName,
188-
],
188+
] + ($operation['defaults'] ?? []),
189189
$operation['requirements'] ?? [],
190-
[],
191-
'',
192-
[],
193-
[$operation['method']]
190+
$operation['options'] ?? [],
191+
$operation['host'] ?? '',
192+
$operation['schemes'] ?? [],
193+
[$operation['method']],
194+
$operation['condition'] ?? ''
194195
);
195196

196197
$routeCollection->add(RouteNameGenerator::generate($operationName, $resourceShortName, $operationType), $route);

tests/Bridge/Symfony/Routing/ApiLoaderTest.php

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,21 @@ public function testApiLoader()
4848
$resourceMetadata = $resourceMetadata->withShortName('dummy');
4949
//default operation based on OperationResourceMetadataFactory
5050
$resourceMetadata = $resourceMetadata->withItemOperations([
51-
'get' => ['method' => 'GET', 'requirements' => ['id' => '\d+']],
51+
'get' => ['method' => 'GET', 'requirements' => ['id' => '\d+'], 'defaults' => ['my_default' => 'default_value', '_controller' => 'should_not_be_overriden']],
5252
'put' => ['method' => 'PUT'],
5353
'delete' => ['method' => 'DELETE'],
5454
]);
5555
//custom operations
5656
$resourceMetadata = $resourceMetadata->withCollectionOperations([
57-
'my_op' => ['method' => 'GET', 'controller' => 'some.service.name', 'requirements' => ['_format' => 'a valid format']], //with controller
58-
'my_second_op' => ['method' => 'POST'], //without controller, takes the default one
57+
'my_op' => ['method' => 'GET', 'controller' => 'some.service.name', 'requirements' => ['_format' => 'a valid format'], 'defaults' => ['my_default' => 'default_value'], 'condition' => "request.headers.get('User-Agent') matches '/firefox/i'"], //with controller
58+
'my_second_op' => ['method' => 'POST', 'options' => ['option' => 'option_value'], 'host' => '{subdomain}.api-platform.com', 'schemes' => ['https']], //without controller, takes the default one
5959
'my_path_op' => ['method' => 'GET', 'path' => 'some/custom/path'], //custom path
6060
]);
6161

6262
$routeCollection = $this->getApiLoaderWithResourceMetadata($resourceMetadata)->load(null);
6363

6464
$this->assertEquals(
65-
$this->getRoute('/dummies/{id}.{_format}', 'api_platform.action.get_item', DummyEntity::class, 'get', ['GET'], false, ['id' => '\d+']),
65+
$this->getRoute('/dummies/{id}.{_format}', 'api_platform.action.get_item', DummyEntity::class, 'get', ['GET'], false, ['id' => '\d+'], ['my_default' => 'default_value']),
6666
$routeCollection->get('api_dummies_get_item')
6767
);
6868

@@ -77,12 +77,12 @@ public function testApiLoader()
7777
);
7878

7979
$this->assertEquals(
80-
$this->getRoute('/dummies.{_format}', 'some.service.name', DummyEntity::class, 'my_op', ['GET'], true, ['_format' => 'a valid format']),
80+
$this->getRoute('/dummies.{_format}', 'some.service.name', DummyEntity::class, 'my_op', ['GET'], true, ['_format' => 'a valid format'], ['my_default' => 'default_value'], [], '', [], "request.headers.get('User-Agent') matches '/firefox/i'"),
8181
$routeCollection->get('api_dummies_my_op_collection')
8282
);
8383

8484
$this->assertEquals(
85-
$this->getRoute('/dummies.{_format}', 'api_platform.action.post_collection', DummyEntity::class, 'my_second_op', ['POST'], true),
85+
$this->getRoute('/dummies.{_format}', 'api_platform.action.post_collection', DummyEntity::class, 'my_second_op', ['POST'], true, [], [], ['option' => 'option_value'], '{subdomain}.api-platform.com', ['https']),
8686
$routeCollection->get('api_dummies_my_second_op_collection')
8787
);
8888

@@ -262,7 +262,7 @@ private function getApiLoaderWithResourceMetadata(ResourceMetadata $resourceMeta
262262
return $apiLoader;
263263
}
264264

265-
private function getRoute(string $path, string $controller, string $resourceClass, string $operationName, array $methods, bool $collection = false, array $requirements = []): Route
265+
private function getRoute(string $path, string $controller, string $resourceClass, string $operationName, array $methods, bool $collection = false, array $requirements = [], array $extraDefaults = [], array $options = [], string $host = '', array $schemes = [], string $condition = ''): Route
266266
{
267267
return new Route(
268268
$path,
@@ -271,12 +271,13 @@ private function getRoute(string $path, string $controller, string $resourceClas
271271
'_format' => null,
272272
'_api_resource_class' => $resourceClass,
273273
sprintf('_api_%s_operation_name', $collection ? 'collection' : 'item') => $operationName,
274-
],
274+
] + $extraDefaults,
275275
$requirements,
276-
[],
277-
'',
278-
[],
279-
$methods
276+
$options,
277+
$host,
278+
$schemes,
279+
$methods,
280+
$condition
280281
);
281282
}
282283

0 commit comments

Comments
 (0)