Skip to content

Commit 23b7855

Browse files
author
abluchet
committed
Fix performance issue because of memory constraint
1 parent c4d2e17 commit 23b7855

File tree

5 files changed

+21
-11
lines changed

5 files changed

+21
-11
lines changed

src/EventListener/SerializeListener.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ public function onKernelView(GetResponseForControllerResultEvent $event)
6060

6161
$context = $this->serializerContextBuilder->createFromRequest($request, true, $attributes);
6262
$resources = [];
63-
$context['resources'] = &$resources;
63+
$context['resources'] = function ($iri) use (&$resources) {
64+
$resources[$iri] = $iri;
65+
};
6466

6567
$event->setControllerResult($this->serializer->serialize($controllerResult, $request->getRequestFormat(), $context));
6668

src/Serializer/AbstractItemNormalizer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public function normalize($object, $format = null, array $context = [])
8888

8989
if (isset($context['resources'])) {
9090
$resource = $context['iri'] ?? $this->iriConverter->getIriFromItem($object);
91-
$context['resources'][$resource] = $resource;
91+
$context['resources']($resource);
9292
}
9393

9494
return parent::normalize($object, $format, $context);
@@ -439,7 +439,7 @@ private function normalizeRelation(PropertyMetadata $propertyMetadata, $relatedO
439439

440440
$iri = $this->iriConverter->getIriFromItem($relatedObject);
441441
if (isset($context['resources'])) {
442-
$context['resources'][$iri] = $iri;
442+
$context['resources']($iri);
443443
}
444444

445445
return $iri;

tests/EventListener/SerializeListenerTest.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,13 @@ public function testDoNotSerializeWhenOperationNotSet()
102102

103103
public function testSerializeCollectionOperation()
104104
{
105-
$expectedContext = ['request_uri' => '', 'resource_class' => 'Foo', 'collection_operation_name' => 'get', 'resources' => []];
105+
$expectedContext = ['request_uri' => '', 'resource_class' => 'Foo', 'collection_operation_name' => 'get'];
106106
$serializerProphecy = $this->prophesize(SerializerInterface::class);
107-
$serializerProphecy->serialize(Argument::any(), 'xml', $expectedContext)->willReturn('bar')->shouldBeCalled();
107+
$serializerProphecy->serialize(Argument::any(), 'xml', Argument::that(function ($context) use ($expectedContext) {
108+
unset($context['resources']);
109+
110+
return $expectedContext === $context;
111+
}))->willReturn('bar')->shouldBeCalled();
108112

109113
$request = new Request([], [], ['_api_resource_class' => 'Foo', '_api_collection_operation_name' => 'get']);
110114
$request->setRequestFormat('xml');
@@ -123,9 +127,13 @@ public function testSerializeCollectionOperation()
123127

124128
public function testSerializeItemOperation()
125129
{
126-
$expectedContext = ['request_uri' => '', 'resource_class' => 'Foo', 'item_operation_name' => 'get', 'resources' => []];
130+
$expectedContext = ['request_uri' => '', 'resource_class' => 'Foo', 'item_operation_name' => 'get'];
127131
$serializerProphecy = $this->prophesize(SerializerInterface::class);
128-
$serializerProphecy->serialize(Argument::any(), 'xml', $expectedContext)->willReturn('bar')->shouldBeCalled();
132+
$serializerProphecy->serialize(Argument::any(), 'xml', Argument::that(function ($context) use ($expectedContext) {
133+
unset($context['resources']);
134+
135+
return $expectedContext === $context;
136+
}))->willReturn('bar')->shouldBeCalled();
129137

130138
$request = new Request([], [], ['_api_resource_class' => 'Foo', '_api_item_operation_name' => 'get']);
131139
$request->setRequestFormat('xml');

tests/Serializer/AbstractItemNormalizerTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public function testNormalize()
145145
'name' => 'foo',
146146
'relatedDummy' => '/dummies/2',
147147
'relatedDummies' => ['/dummies/2'],
148-
], $normalizer->normalize($dummy, null, ['resources' => []]));
148+
], $normalizer->normalize($dummy, null, ['resources' => function () {}]));
149149
}
150150

151151
public function testNormalizeReadableLinks()
@@ -211,7 +211,7 @@ public function testNormalizeReadableLinks()
211211
$this->assertEquals([
212212
'relatedDummy' => ['foo' => 'hello'],
213213
'relatedDummies' => [['foo' => 'hello']],
214-
], $normalizer->normalize($dummy, null, ['resources' => []]));
214+
], $normalizer->normalize($dummy, null, ['resources' => function () {}]));
215215
}
216216

217217
public function testDenormalize()
@@ -642,6 +642,6 @@ public function testChildInheritedProperty()
642642
$this->assertEquals([
643643
'name' => 'foo',
644644
'nickname' => null,
645-
], $normalizer->normalize($dummy, null, ['resource_class' => DummyTableInheritance::class, 'resources' => []]));
645+
], $normalizer->normalize($dummy, null, ['resource_class' => DummyTableInheritance::class, 'resources' => function () {}]));
646646
}
647647
}

tests/Serializer/ItemNormalizerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public function testNormalize()
9595
);
9696
$normalizer->setSerializer($serializerProphecy->reveal());
9797

98-
$this->assertEquals(['name' => 'hello'], $normalizer->normalize($dummy, null, ['resources' => []]));
98+
$this->assertEquals(['name' => 'hello'], $normalizer->normalize($dummy, null, ['resources' => function () {}]));
9999
}
100100

101101
public function testDenormalize()

0 commit comments

Comments
 (0)