|
13 | 13 |
|
14 | 14 | use ApiPlatform\Core\Api\RequestAttributesExtractor;
|
15 | 15 | use ApiPlatform\Core\Exception\RuntimeException;
|
16 |
| -use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; |
| 16 | +use ApiPlatform\Core\Serializer\SerializerContextBuilderInterface; |
17 | 17 | use Symfony\Component\HttpFoundation\Request;
|
18 | 18 | use Symfony\Component\HttpFoundation\Response;
|
19 | 19 | use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
|
|
27 | 27 | final class DeserializerViewListener
|
28 | 28 | {
|
29 | 29 | private $serializer;
|
30 |
| - private $resourceMetadataFactory; |
| 30 | + private $serializerContextBuilder; |
31 | 31 |
|
32 |
| - public function __construct(SerializerInterface $serializer, ResourceMetadataFactoryInterface $resourceMetadataFactory) |
| 32 | + public function __construct(SerializerInterface $serializer, SerializerContextBuilderInterface $serializerContextBuilder) |
33 | 33 | {
|
34 | 34 | $this->serializer = $serializer;
|
35 |
| - $this->resourceMetadataFactory = $resourceMetadataFactory; |
| 35 | + $this->serializerContextBuilder = $serializerContextBuilder; |
36 | 36 | }
|
37 | 37 |
|
| 38 | + /** |
| 39 | + * Deserializes the data sent in the requested format. |
| 40 | + * |
| 41 | + * @param GetResponseForControllerResultEvent $event |
| 42 | + */ |
38 | 43 | public function onKernelView(GetResponseForControllerResultEvent $event)
|
39 | 44 | {
|
40 |
| - $data = $event->getControllerResult(); |
| 45 | + $controllerResult = $event->getControllerResult(); |
41 | 46 | $request = $event->getRequest();
|
42 | 47 |
|
43 |
| - if ($data instanceof Response || !in_array($request->getMethod(), [Request::METHOD_POST, Request::METHOD_PUT], true)) { |
| 48 | + if ($controllerResult instanceof Response || !in_array($request->getMethod(), [Request::METHOD_POST, Request::METHOD_PUT], true)) { |
44 | 49 | return;
|
45 | 50 | }
|
46 | 51 |
|
47 | 52 | try {
|
48 |
| - list($resourceClass, $collectionOperationName, $itemOperationName, $format) = RequestAttributesExtractor::extractAttributes($request); |
| 53 | + $extractedAttributes = RequestAttributesExtractor::extractAttributes($request); |
49 | 54 | } catch (RuntimeException $e) {
|
50 | 55 | return;
|
51 | 56 | }
|
52 | 57 |
|
53 |
| - $resourceMetadata = $this->resourceMetadataFactory->create($resourceClass); |
54 |
| - |
55 |
| - if ($collectionOperationName) { |
56 |
| - $context = $resourceMetadata->getCollectionOperationAttribute($collectionOperationName, 'denormalization_context', [], true); |
57 |
| - $context['collection_operation_name'] = $collectionOperationName; |
58 |
| - } else { |
59 |
| - $context = $resourceMetadata->getItemOperationAttribute($itemOperationName, 'denormalization_context', [], true); |
60 |
| - $context['item_operation_name'] = $itemOperationName; |
61 |
| - } |
62 |
| - |
63 |
| - $context['resource_class'] = $resourceClass; |
64 |
| - $context['request_uri'] = $request->getRequestUri(); |
65 |
| - |
66 |
| - if (null !== $data) { |
67 |
| - $context['object_to_populate'] = $data; |
| 58 | + $context = $this->serializerContextBuilder->createFromRequest($request, false, $extractedAttributes); |
| 59 | + if (null !== $controllerResult) { |
| 60 | + $context['object_to_populate'] = $controllerResult; |
68 | 61 | }
|
69 | 62 |
|
70 |
| - $event->setControllerResult($this->serializer->deserialize($request->getContent(), $resourceClass, $format, $context)); |
| 63 | + $event->setControllerResult( |
| 64 | + $this->serializer->deserialize($request->getContent(), $extractedAttributes[0], $extractedAttributes[3], $context) |
| 65 | + ); |
71 | 66 | }
|
72 | 67 | }
|
0 commit comments