diff --git a/core/modules/serialization/src/Encoder/XmlEncoder.php b/core/modules/serialization/src/Encoder/XmlEncoder.php index 5582713565a1b9aff795413134e0c8fbc87ba48a..9db6ecde0123c919783aacbfba58f910a87777f0 100644 --- a/core/modules/serialization/src/Encoder/XmlEncoder.php +++ b/core/modules/serialization/src/Encoder/XmlEncoder.php @@ -4,6 +4,7 @@ use Symfony\Component\Serializer\Encoder\EncoderInterface; use Symfony\Component\Serializer\Encoder\DecoderInterface; +use Symfony\Component\Serializer\Encoder\SerializerAwareEncoder; use Symfony\Component\Serializer\Encoder\XmlEncoder as BaseXmlEncoder; /** @@ -12,7 +13,7 @@ * This acts as a wrapper class for Symfony's XmlEncoder so that it is not * implementing NormalizationAwareInterface, and can be normalized externally. */ -class XmlEncoder implements EncoderInterface, DecoderInterface { +class XmlEncoder extends SerializerAwareEncoder implements EncoderInterface, DecoderInterface { /** * The formats that this Encoder supports. @@ -37,6 +38,7 @@ class XmlEncoder implements EncoderInterface, DecoderInterface { public function getBaseEncoder() { if (!isset($this->baseEncoder)) { $this->baseEncoder = new BaseXmlEncoder(); + $this->baseEncoder->setSerializer($this->serializer); } return $this->baseEncoder; diff --git a/core/modules/serialization/tests/src/Unit/Encoder/XmlEncoderTest.php b/core/modules/serialization/tests/src/Unit/Encoder/XmlEncoderTest.php index 88c7a1d8ea11cf7e6f5b2f3a589072898d701d3d..a347982b372fd6cb0b43ca77910d9449d9683b2a 100644 --- a/core/modules/serialization/tests/src/Unit/Encoder/XmlEncoderTest.php +++ b/core/modules/serialization/tests/src/Unit/Encoder/XmlEncoderTest.php @@ -3,6 +3,9 @@ namespace Drupal\Tests\serialization\Unit\Encoder; use Drupal\serialization\Encoder\XmlEncoder; +use Symfony\Component\Serializer\Encoder\XmlEncoder as BaseXmlEncoder; +use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; +use Symfony\Component\Serializer\Serializer; use Drupal\Tests\UnitTestCase; /** @@ -31,7 +34,7 @@ class XmlEncoderTest extends UnitTestCase { protected $testArray = ['test' => 'test']; protected function setUp() { - $this->baseEncoder = $this->getMock('Symfony\Component\Serializer\Encoder\XmlEncoder'); + $this->baseEncoder = $this->getMock(BaseXmlEncoder::class); $this->encoder = new XmlEncoder(); $this->encoder->setBaseEncoder($this->baseEncoder); } @@ -76,4 +79,26 @@ public function testDecode() { $this->assertEquals($this->testArray, $this->encoder->decode('test', 'test')); } + /** + * @covers ::getBaseEncoder + */ + public function testDefaultEncoderHasSerializer() { + // The serializer should be set on the Drupal encoder, which should then + // set it on our default encoder. + $encoder = new XmlEncoder(); + $serialzer = new Serializer([new GetSetMethodNormalizer()]); + $encoder->setSerializer($serialzer); + $base_encoder = $encoder->getBaseEncoder(); + $this->assertInstanceOf(BaseXmlEncoder::class, $base_encoder); + // Test the encoder. + $base_encoder->encode(['a' => new TestObject()], 'xml'); + } + +} + +class TestObject { + public function getA() { + return 'A'; + } + }