From 790fb6e760a764fd51630fa94c60e0152e62d8ff Mon Sep 17 00:00:00 2001 From: Joel Wurtz Date: Tue, 26 Jan 2016 13:57:16 +0100 Subject: [PATCH] Add normalizer / denormalizer awarness --- .../Normalizer/AbstractNormalizer.php | 6 +++- .../Normalizer/CustomNormalizer.php | 7 +++- .../Normalizer/DenormalizerAwareInterface.php | 27 ++++++++++++++ .../Normalizer/DenormalizerAwareTrait.php | 35 +++++++++++++++++++ .../Normalizer/NormalizerAwareInterface.php | 27 ++++++++++++++ .../Normalizer/NormalizerAwareTrait.php | 35 +++++++++++++++++++ .../Normalizer/SerializerAwareNormalizer.php | 17 +++------ .../Component/Serializer/Serializer.php | 10 ++++++ .../Serializer/SerializerAwareTrait.php | 35 +++++++++++++++++++ .../Serializer/Tests/SerializerTest.php | 24 +++++++++++++ 10 files changed, 208 insertions(+), 15 deletions(-) create mode 100644 src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareInterface.php create mode 100644 src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareTrait.php create mode 100644 src/Symfony/Component/Serializer/Normalizer/NormalizerAwareInterface.php create mode 100644 src/Symfony/Component/Serializer/Normalizer/NormalizerAwareTrait.php create mode 100644 src/Symfony/Component/Serializer/SerializerAwareTrait.php diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php index 69cbc54bed53..5eedac7253b8 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php @@ -17,14 +17,18 @@ use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; use Symfony\Component\Serializer\Mapping\AttributeMetadataInterface; use Symfony\Component\Serializer\NameConverter\NameConverterInterface; +use Symfony\Component\Serializer\SerializerAwareInterface; +use Symfony\Component\Serializer\SerializerAwareTrait; /** * Normalizer implementation. * * @author Kévin Dunglas */ -abstract class AbstractNormalizer extends SerializerAwareNormalizer implements NormalizerInterface, DenormalizerInterface +abstract class AbstractNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface { + use SerializerAwareTrait; + const CIRCULAR_REFERENCE_LIMIT = 'circular_reference_limit'; const OBJECT_TO_POPULATE = 'object_to_populate'; const GROUPS = 'groups'; diff --git a/src/Symfony/Component/Serializer/Normalizer/CustomNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/CustomNormalizer.php index be8b7d5fd747..f90ee866627a 100644 --- a/src/Symfony/Component/Serializer/Normalizer/CustomNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/CustomNormalizer.php @@ -11,11 +11,16 @@ namespace Symfony\Component\Serializer\Normalizer; +use Symfony\Component\Serializer\SerializerAwareInterface; +use Symfony\Component\Serializer\SerializerAwareTrait; + /** * @author Jordi Boggiano */ -class CustomNormalizer extends SerializerAwareNormalizer implements NormalizerInterface, DenormalizerInterface +class CustomNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface { + use SerializerAwareTrait; + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareInterface.php b/src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareInterface.php new file mode 100644 index 000000000000..4a6a4e26e92d --- /dev/null +++ b/src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +/** + * Class accepting a denormalizer. + * + * @author Joel Wurtz + */ +interface DenormalizerAwareInterface +{ + /** + * Sets the owning Denormalizer object. + * + * @param DenormalizerInterface $denormalizer + */ + public function setDenormalizer(DenormalizerInterface $denormalizer); +} diff --git a/src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareTrait.php b/src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareTrait.php new file mode 100644 index 000000000000..8a8a1ad523b1 --- /dev/null +++ b/src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareTrait.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +/** + * DenormalizerAware trait. + * + * @author Joel Wurtz + */ +trait DenormalizerAwareTrait +{ + /** + * @var DenormalizerInterface + */ + protected $denormalizer; + + /** + * Sets the Denormalizer. + * + * @param DenormalizerInterface $denormalizer A DenormalizerInterface instance + */ + public function setSerializer(DenormalizerInterface $denormalizer) + { + $this->denormalizer = $denormalizer; + } +} diff --git a/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareInterface.php b/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareInterface.php new file mode 100644 index 000000000000..55015fe6658b --- /dev/null +++ b/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +/** + * Class accepting a normalizer. + * + * @author Joel Wurtz + */ +interface NormalizerAwareInterface +{ + /** + * Sets the owning Normalizer object. + * + * @param NormalizerInterface $normalizer + */ + public function setNormalizer(NormalizerInterface $normalizer); +} diff --git a/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareTrait.php b/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareTrait.php new file mode 100644 index 000000000000..cd053970dee2 --- /dev/null +++ b/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareTrait.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +/** + * NormalizerAware trait. + * + * @author Joel Wurtz + */ +trait NormalizerAwareTrait +{ + /** + * @var NormalizerInterface + */ + protected $normalizer; + + /** + * Sets the normalizer. + * + * @param NormalizerInterface $normalizer A NormalizerInterface instance + */ + public function setSerializer(NormalizerInterface $normalizer) + { + $this->normalizer = $normalizer; + } +} diff --git a/src/Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.php index 395685707405..0480d9ffba98 100644 --- a/src/Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.php @@ -11,26 +11,17 @@ namespace Symfony\Component\Serializer\Normalizer; -use Symfony\Component\Serializer\SerializerInterface; +use Symfony\Component\Serializer\SerializerAwareTrait; use Symfony\Component\Serializer\SerializerAwareInterface; /** * SerializerAware Normalizer implementation. * * @author Jordi Boggiano + * + * @deprecated since version 3.1, to be removed in 4.0. Use the SerializerAwareTrait instead. */ abstract class SerializerAwareNormalizer implements SerializerAwareInterface { - /** - * @var SerializerInterface - */ - protected $serializer; - - /** - * {@inheritdoc} - */ - public function setSerializer(SerializerInterface $serializer) - { - $this->serializer = $serializer; - } + use SerializerAwareTrait; } diff --git a/src/Symfony/Component/Serializer/Serializer.php b/src/Symfony/Component/Serializer/Serializer.php index 59943550a554..d8f257a12ef8 100644 --- a/src/Symfony/Component/Serializer/Serializer.php +++ b/src/Symfony/Component/Serializer/Serializer.php @@ -15,6 +15,8 @@ use Symfony\Component\Serializer\Encoder\ChainEncoder; use Symfony\Component\Serializer\Encoder\EncoderInterface; use Symfony\Component\Serializer\Encoder\DecoderInterface; +use Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; use Symfony\Component\Serializer\Exception\LogicException; @@ -68,6 +70,14 @@ public function __construct(array $normalizers = array(), array $encoders = arra if ($normalizer instanceof SerializerAwareInterface) { $normalizer->setSerializer($this); } + + if ($normalizer instanceof DenormalizerAwareInterface) { + $normalizer->setDenormalizer($this); + } + + if ($normalizer instanceof NormalizerAwareInterface) { + $normalizer->setNormalizer($this); + } } $this->normalizers = $normalizers; diff --git a/src/Symfony/Component/Serializer/SerializerAwareTrait.php b/src/Symfony/Component/Serializer/SerializerAwareTrait.php new file mode 100644 index 000000000000..7f5839eef3e6 --- /dev/null +++ b/src/Symfony/Component/Serializer/SerializerAwareTrait.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer; + +/** + * SerializerAware trait. + * + * @author Joel Wurtz + */ +trait SerializerAwareTrait +{ + /** + * @var SerializerInterface + */ + protected $serializer; + + /** + * Sets the serializer. + * + * @param SerializerInterface $serializer A SerializerInterface instance + */ + public function setSerializer(SerializerInterface $serializer) + { + $this->serializer = $serializer; + } +} diff --git a/src/Symfony/Component/Serializer/Tests/SerializerTest.php b/src/Symfony/Component/Serializer/Tests/SerializerTest.php index 0a6bbe51bdb9..2bb03483db27 100644 --- a/src/Symfony/Component/Serializer/Tests/SerializerTest.php +++ b/src/Symfony/Component/Serializer/Tests/SerializerTest.php @@ -12,6 +12,10 @@ namespace Symfony\Component\Serializer\Tests; use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer; +use Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface; +use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; use Symfony\Component\Serializer\Normalizer\PropertyNormalizer; use Symfony\Component\Serializer\Serializer; @@ -312,6 +316,26 @@ public function testDeserializeArray() $serializer->deserialize($jsonData, __NAMESPACE__.'\Model[]', 'json') ); } + + public function testNormalizerAware() + { + $normalizerAware = $this->getMock(NormalizerAwareInterface::class); + $normalizerAware->expects($this->once()) + ->method('setNormalizer') + ->with($this->isInstanceOf(NormalizerInterface::class)); + + new Serializer([$normalizerAware]); + } + + public function testDenormalizerAware() + { + $denormalizerAware = $this->getMock(DenormalizerAwareInterface::class); + $denormalizerAware->expects($this->once()) + ->method('setDenormalizer') + ->with($this->isInstanceOf(DenormalizerInterface::class)); + + new Serializer([$denormalizerAware]); + } } class Model