1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
namespace App\Serializer;
use App\Entity\Prestataire;
use Sonata\MediaBundle\Provider\Pool;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\SerializerAwareInterface;
use Symfony\Component\Serializer\SerializerInterface;
/**
* This class allows to expose the media of a Prestataire in ApiPlatform
* (because it's not possible with a Media from SonataMediaBundle).
*/
final class ApiNormalizer implements NormalizerInterface, SerializerAwareInterface
{
private $decorated;
private $pool;
public function __construct(NormalizerInterface $decorated, Pool $pool)
{
$this->decorated = $decorated;
$this->pool = $pool;
}
public function supportsNormalization($data, $format = null)
{
return $this->decorated->supportsNormalization($data, $format);
}
public function normalize($object, $format = null, array $context = [])
{
$data = $this->decorated->normalize($object, $format, $context);
// In the case of normalizing a Prestataire...
if (!$object instanceof Prestataire) {
return $data;
}
// ... we retrieve its associated Sonata Media (from the Sonata Media's provider, from the providers pool)
if (is_array($data) && $media = $object->getMedia()) {
if ($provider = $this->pool->getProvider($media->getProviderName())) {
$data['media'] = $provider->getHelperProperties($media, 'reference');
}
}
return $data;
}
public function setSerializer(SerializerInterface $serializer)
{
if ($this->decorated instanceof SerializerAwareInterface) {
$this->decorated->setSerializer($serializer);
}
}
}