Skip to content

Commit 4fffea6

Browse files
authored
Merge pull request #1283 from soyuka/fix/psr-6-cache-subresource
Fix/psr 6 cache subresource
2 parents 555cca6 + 0817957 commit 4fffea6

File tree

6 files changed

+23
-29
lines changed

6 files changed

+23
-29
lines changed

src/Operation/Factory/CachedSubresourceOperationFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public function __construct(CacheItemPoolInterface $cacheItemPool, SubresourceOp
3737
*/
3838
public function create(string $resourceClass): array
3939
{
40-
$cacheKey = self::CACHE_KEY_PREFIX.str_replace('\\', '', $resourceClass);
40+
$cacheKey = self::CACHE_KEY_PREFIX.md5($resourceClass);
4141

4242
try {
4343
$cacheItem = $this->cacheItemPool->getItem($cacheKey);

src/Operation/Factory/SubresourceOperationFactory.php

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ public function create(string $resourceClass): array
5858
* @param array $tree
5959
* @param string $rootResourceClass null on the first iteration, it then keeps track of the origin resource class
6060
* @param array $parentOperation the previous call operation
61+
* @param array $visited
6162
*/
62-
private function computeSubresourceOperations(string $resourceClass, array &$tree, string $rootResourceClass = null, array $parentOperation = null, $parentVisiting = null)
63+
private function computeSubresourceOperations(string $resourceClass, array &$tree, string $rootResourceClass = null, array $parentOperation = null, array $visited = [])
6364
{
6465
if (null === $rootResourceClass) {
6566
$rootResourceClass = $resourceClass;
@@ -76,16 +77,9 @@ private function computeSubresourceOperations(string $resourceClass, array &$tre
7677
$subresourceClass = $subresource->getResourceClass();
7778
$subresourceMetadata = $this->resourceMetadataFactory->create($subresourceClass);
7879

79-
if (null === $parentOperation) {
80-
$visiting = "$rootResourceClass-$property-$subresourceClass";
81-
} else {
82-
$suffix = "$property-$subresourceClass";
83-
84-
if (false !== strpos($parentVisiting, $suffix)) {
85-
continue;
86-
}
87-
88-
$visiting = "$parentVisiting-$suffix";
80+
$visiting = "$resourceClass $property $subresourceClass";
81+
if (isset($visited[$visiting])) {
82+
continue;
8983
}
9084

9185
$operationName = 'get';
@@ -137,9 +131,9 @@ private function computeSubresourceOperations(string $resourceClass, array &$tre
137131
$operation['path'] .= sprintf('/%s%s', $this->pathSegmentNameGenerator->getSegmentName($property, $operation['collection']), self::FORMAT_SUFFIX);
138132
}
139133

140-
$tree[$visiting] = $operation;
134+
$tree[$operation['route_name']] = $operation;
141135

142-
$this->computeSubresourceOperations($subresourceClass, $tree, $rootResourceClass, $operation, $visiting);
136+
$this->computeSubresourceOperations($subresourceClass, $tree, $rootResourceClass, $operation, $visited + [$visiting => true]);
143137
}
144138
}
145139
}

tests/Bridge/Symfony/Routing/ApiLoaderTest.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public function testApiLoader()
9191
);
9292

9393
$this->assertEquals(
94-
$this->getSubresourceRoute('/dummies/{id}/subresources.{_format}', 'api_platform.action.get_subresource', RelatedDummyEntity::class, 'api_dummies_subresources_get_subresource', ['property' => 'subresource', 'identifiers' => [['id', DummyEntity::class, true]], 'collection' => true, 'operationId' => 'ApiPlatform\Core\Tests\Fixtures\DummyEntity-subresource-ApiPlatform\Core\Tests\Fixtures\RelatedDummyEntity']),
94+
$this->getSubresourceRoute('/dummies/{id}/subresources.{_format}', 'api_platform.action.get_subresource', RelatedDummyEntity::class, 'api_dummies_subresources_get_subresource', ['property' => 'subresource', 'identifiers' => [['id', DummyEntity::class, true]], 'collection' => true, 'operationId' => 'api_dummies_subresources_get_subresource']),
9595
$routeCollection->get('api_dummies_subresources_get_subresource')
9696
);
9797
}
@@ -160,32 +160,32 @@ public function testRecursiveSubresource()
160160
$routeCollection = $this->getApiLoaderWithResourceMetadata($resourceMetadata, true)->load(null);
161161

162162
$this->assertEquals(
163-
$this->getSubresourceRoute('/dummies/{id}/subresources.{_format}', 'api_platform.action.get_subresource', RelatedDummyEntity::class, 'api_dummies_subresources_get_subresource', ['property' => 'subresource', 'identifiers' => [['id', DummyEntity::class, true]], 'collection' => true, 'operationId' => 'ApiPlatform\Core\Tests\Fixtures\DummyEntity-subresource-ApiPlatform\Core\Tests\Fixtures\RelatedDummyEntity']),
163+
$this->getSubresourceRoute('/dummies/{id}/subresources.{_format}', 'api_platform.action.get_subresource', RelatedDummyEntity::class, 'api_dummies_subresources_get_subresource', ['property' => 'subresource', 'identifiers' => [['id', DummyEntity::class, true]], 'collection' => true, 'operationId' => 'api_dummies_subresources_get_subresource']),
164164
$routeCollection->get('api_dummies_subresources_get_subresource')
165165
);
166166

167167
$this->assertEquals(
168-
$this->getSubresourceRoute('/related_dummies/{id}/recursivesubresource/subresources.{_format}', 'api_platform.action.get_subresource', RelatedDummyEntity::class, 'api_related_dummies_recursivesubresource_subresources_get_subresource', ['property' => 'subresource', 'identifiers' => [['id', RelatedDummyEntity::class, true], ['recursivesubresource', DummyEntity::class, false]], 'collection' => true, 'operationId' => 'ApiPlatform\Core\Tests\Fixtures\RelatedDummyEntity-recursivesubresource-ApiPlatform\Core\Tests\Fixtures\DummyEntity-subresource-ApiPlatform\Core\Tests\Fixtures\RelatedDummyEntity']),
168+
$this->getSubresourceRoute('/related_dummies/{id}/recursivesubresource/subresources.{_format}', 'api_platform.action.get_subresource', RelatedDummyEntity::class, 'api_related_dummies_recursivesubresource_subresources_get_subresource', ['property' => 'subresource', 'identifiers' => [['id', RelatedDummyEntity::class, true], ['recursivesubresource', DummyEntity::class, false]], 'collection' => true, 'operationId' => 'api_related_dummies_recursivesubresource_subresources_get_subresource']),
169169
$routeCollection->get('api_related_dummies_recursivesubresource_subresources_get_subresource')
170170
);
171171

172172
$this->assertEquals(
173-
$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' => 'ApiPlatform\Core\Tests\Fixtures\RelatedDummyEntity-recursivesubresource-ApiPlatform\Core\Tests\Fixtures\DummyEntity']),
173+
$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']),
174174
$routeCollection->get('api_related_dummies_recursivesubresource_get_subresource')
175175
);
176176

177177
$this->assertEquals(
178-
$this->getSubresourceRoute('/dummies/{id}/subresources/{subresource}/recursivesubresource.{_format}', 'api_platform.action.get_subresource', DummyEntity::class, 'api_dummies_subresources_recursivesubresource_get_subresource', ['property' => 'recursivesubresource', 'identifiers' => [['id', DummyEntity::class, true], ['subresource', RelatedDummyEntity::class, true]], 'collection' => false, 'operationId' => 'ApiPlatform\Core\Tests\Fixtures\DummyEntity-subresource-ApiPlatform\Core\Tests\Fixtures\RelatedDummyEntity-recursivesubresource-ApiPlatform\Core\Tests\Fixtures\DummyEntity']),
178+
$this->getSubresourceRoute('/dummies/{id}/subresources/{subresource}/recursivesubresource.{_format}', 'api_platform.action.get_subresource', DummyEntity::class, 'api_dummies_subresources_recursivesubresource_get_subresource', ['property' => 'recursivesubresource', 'identifiers' => [['id', DummyEntity::class, true], ['subresource', RelatedDummyEntity::class, true]], 'collection' => false, 'operationId' => 'api_dummies_subresources_recursivesubresource_get_subresource']),
179179
$routeCollection->get('api_dummies_subresources_recursivesubresource_get_subresource')
180180
);
181181

182182
$this->assertEquals(
183-
$this->getSubresourceRoute('/related_dummies/{id}/secondrecursivesubresource/subresources.{_format}', 'api_platform.action.get_subresource', RelatedDummyEntity::class, 'api_related_dummies_secondrecursivesubresource_subresources_get_subresource', ['property' => 'subresource', 'identifiers' => [['id', RelatedDummyEntity::class, true], ['secondrecursivesubresource', DummyEntity::class, false]], 'collection' => true, 'operationId' => 'ApiPlatform\Core\Tests\Fixtures\RelatedDummyEntity-secondrecursivesubresource-ApiPlatform\Core\Tests\Fixtures\DummyEntity-subresource-ApiPlatform\Core\Tests\Fixtures\RelatedDummyEntity']),
183+
$this->getSubresourceRoute('/related_dummies/{id}/secondrecursivesubresource/subresources.{_format}', 'api_platform.action.get_subresource', RelatedDummyEntity::class, 'api_related_dummies_secondrecursivesubresource_subresources_get_subresource', ['property' => 'subresource', 'identifiers' => [['id', RelatedDummyEntity::class, true], ['secondrecursivesubresource', DummyEntity::class, false]], 'collection' => true, 'operationId' => 'api_related_dummies_secondrecursivesubresource_subresources_get_subresource']),
184184
$routeCollection->get('api_related_dummies_secondrecursivesubresource_subresources_get_subresource')
185185
);
186186

187187
$this->assertEquals(
188-
$this->getSubresourceRoute('/related_dummies/{id}/secondrecursivesubresource.{_format}', 'api_platform.action.get_subresource', DummyEntity::class, 'api_related_dummies_secondrecursivesubresource_get_subresource', ['property' => 'secondrecursivesubresource', 'identifiers' => [['id', RelatedDummyEntity::class, true]], 'collection' => false, 'operationId' => 'ApiPlatform\Core\Tests\Fixtures\RelatedDummyEntity-secondrecursivesubresource-ApiPlatform\Core\Tests\Fixtures\DummyEntity']),
188+
$this->getSubresourceRoute('/related_dummies/{id}/secondrecursivesubresource.{_format}', 'api_platform.action.get_subresource', DummyEntity::class, 'api_related_dummies_secondrecursivesubresource_get_subresource', ['property' => 'secondrecursivesubresource', 'identifiers' => [['id', RelatedDummyEntity::class, true]], 'collection' => false, 'operationId' => 'api_related_dummies_secondrecursivesubresource_get_subresource']),
189189
$routeCollection->get('api_related_dummies_secondrecursivesubresource_get_subresource')
190190
);
191191
}

tests/Operation/Factory/CachedSubresourceOperationFactoryTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,6 @@ public function testCreateWithGetCacheItemThrowsCacheException()
8181

8282
private function generateCacheKey(string $resourceClass = Dummy::class)
8383
{
84-
return CachedSubresourceOperationFactory::CACHE_KEY_PREFIX.str_replace('\\', '', $resourceClass);
84+
return CachedSubresourceOperationFactory::CACHE_KEY_PREFIX.md5($resourceClass);
8585
}
8686
}

tests/Operation/Factory/SubresourceOperationFactoryTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public function testCreate()
6060
$subresourceOperationFactory = new SubresourceOperationFactory($resourceMetadataFactoryProphecy->reveal(), $propertyNameCollectionFactoryProphecy->reveal(), $propertyMetadataFactoryProphecy->reveal(), $pathSegmentNameGeneratorProphecy->reveal());
6161

6262
$this->assertEquals([
63-
'ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity-subresource-ApiPlatform\\Core\\Tests\\Fixtures\\RelatedDummyEntity' => [
63+
'api_dummy_entities_subresource_get_subresource' => [
6464
'property' => 'subresource',
6565
'collection' => false,
6666
'resource_class' => RelatedDummyEntity::class,
@@ -71,7 +71,7 @@ public function testCreate()
7171
'route_name' => 'api_dummy_entities_subresource_get_subresource',
7272
'path' => '/dummy_entities/{id}/subresource.{_format}',
7373
],
74-
'ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity-subresource-ApiPlatform\\Core\\Tests\\Fixtures\\RelatedDummyEntity-anotherSubresource-ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity' => [
74+
'api_dummy_entities_subresource_another_subresource_get_subresource' => [
7575
'property' => 'anotherSubresource',
7676
'collection' => false,
7777
'resource_class' => DummyEntity::class,
@@ -83,7 +83,7 @@ public function testCreate()
8383
'route_name' => 'api_dummy_entities_subresource_another_subresource_get_subresource',
8484
'path' => '/dummy_entities/{id}/subresource/another_subresource.{_format}',
8585
],
86-
'ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity-subresource-ApiPlatform\\Core\\Tests\\Fixtures\\RelatedDummyEntity-anotherSubresource-ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity-subcollection-ApiPlatform\\Core\\Tests\\Fixtures\\RelatedDummyEntity' => [
86+
'api_dummy_entities_subresource_another_subresource_subcollections_get_subresource' => [
8787
'property' => 'subcollection',
8888
'collection' => true,
8989
'resource_class' => RelatedDummyEntity::class,
@@ -96,7 +96,7 @@ public function testCreate()
9696
'route_name' => 'api_dummy_entities_subresource_another_subresource_subcollections_get_subresource',
9797
'path' => '/dummy_entities/{id}/subresource/another_subresource/subcollections.{_format}',
9898
],
99-
'ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity-subcollection-ApiPlatform\\Core\\Tests\\Fixtures\\RelatedDummyEntity' => [
99+
'api_dummy_entities_subcollections_get_subresource' => [
100100
'property' => 'subcollection',
101101
'collection' => true,
102102
'resource_class' => RelatedDummyEntity::class,
@@ -107,7 +107,7 @@ public function testCreate()
107107
'route_name' => 'api_dummy_entities_subcollections_get_subresource',
108108
'path' => '/dummy_entities/{id}/subcollections.{_format}',
109109
],
110-
'ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity-subcollection-ApiPlatform\\Core\\Tests\\Fixtures\\RelatedDummyEntity-anotherSubresource-ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity' => [
110+
'api_dummy_entities_subcollections_another_subresource_get_subresource' => [
111111
'property' => 'anotherSubresource',
112112
'collection' => false,
113113
'resource_class' => DummyEntity::class,
@@ -119,7 +119,7 @@ public function testCreate()
119119
'route_name' => 'api_dummy_entities_subcollections_another_subresource_get_subresource',
120120
'path' => '/dummy_entities/{id}/subcollections/{subcollection}/another_subresource.{_format}',
121121
],
122-
'ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity-subcollection-ApiPlatform\\Core\\Tests\\Fixtures\\RelatedDummyEntity-anotherSubresource-ApiPlatform\\Core\\Tests\\Fixtures\\DummyEntity-subresource-ApiPlatform\\Core\\Tests\\Fixtures\\RelatedDummyEntity' => [
122+
'api_dummy_entities_subcollections_another_subresource_subresource_get_subresource' => [
123123
'property' => 'subresource',
124124
'collection' => false,
125125
'resource_class' => RelatedDummyEntity::class,

tests/Swagger/Serializer/DocumentationNormalizerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1572,7 +1572,7 @@ public function testNormalizeWithSubResource()
15721572
'/api/questions/{id}/answer' => new \ArrayObject([
15731573
'get' => new \ArrayObject([
15741574
'tags' => ['Answer', 'Question'],
1575-
'operationId' => 'ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\Question-answer-ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\Answer',
1575+
'operationId' => 'api_questions_answer_get_subresource',
15761576
'produces' => ['application/ld+json'],
15771577
'summary' => 'Retrieves a Answer resource.',
15781578
'responses' => [

0 commit comments

Comments
 (0)