Skip to content

Commit 4976011

Browse files
authored
Merge pull request #1307 from soyuka/fix/perf/1303
Avoid serializing "resources" in the normalization context
2 parents c4d2e17 + ef27bed commit 4976011

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

src/EventListener/SerializeListener.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,17 @@ public function onKernelView(GetResponseForControllerResultEvent $event)
5959
}
6060

6161
$context = $this->serializerContextBuilder->createFromRequest($request, true, $attributes);
62-
$resources = [];
62+
$resources = new class() extends \ArrayObject {
63+
public function serialize()
64+
{
65+
}
66+
};
6367
$context['resources'] = &$resources;
6468

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

6771
$request->attributes->set('_api_respond', true);
68-
$request->attributes->set('_resources', $request->attributes->get('_resources', []) + $resources);
72+
$request->attributes->set('_resources', $request->attributes->get('_resources', []) + (array) $resources);
6973
}
7074

7175
/**

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 $context === $expectedContext;
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 $context === $expectedContext;
136+
}))->willReturn('bar')->shouldBeCalled();
129137

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

0 commit comments

Comments
 (0)