diff --git a/core/modules/serialization/serialization.services.yml b/core/modules/serialization/serialization.services.yml index bc491e6..389ac05 100644 --- a/core/modules/serialization/serialization.services.yml +++ b/core/modules/serialization/serialization.services.yml @@ -34,7 +34,6 @@ services: - { name: encoder, format: xml } serializer.entity_resolver: class: Drupal\serialization\EntityResolver\ChainEntityResolver - arguments: [{ }] serializer.entity_resolver.uuid: class: Drupal\serialization\EntityResolver\UuidResolver tags: diff --git a/core/modules/serialization/src/EntityResolver/ChainEntityResolver.php b/core/modules/serialization/src/EntityResolver/ChainEntityResolver.php index 8127c79..741399b 100644 --- a/core/modules/serialization/src/EntityResolver/ChainEntityResolver.php +++ b/core/modules/serialization/src/EntityResolver/ChainEntityResolver.php @@ -19,7 +19,7 @@ class ChainEntityResolver implements EntityResolverInterface { * * @var \Drupal\serialization\EntityResolver\EntityResolverInterface[] */ - protected $resolvers; + protected $resolvers = array(); /** * Constructs a ChainEntityResolver object. @@ -32,6 +32,16 @@ public function __construct(array $resolvers = array()) { } /** + * Adds an entity resolver. + * + * @param \Drupal\serialization\EntityResolver\EntityResolverInterface $resolver + * The entity resolver to add. + */ + public function addResolver(EntityResolverInterface $resolver) { + $this->resolvers[] = $resolver; + } + + /** * {@inheritdoc} */ public function resolve(NormalizerInterface $normalizer, $data, $entity_type) { diff --git a/core/modules/serialization/src/RegisterEntityResolversCompilerPass.php b/core/modules/serialization/src/RegisterEntityResolversCompilerPass.php index 6399f50..60e45eb 100644 --- a/core/modules/serialization/src/RegisterEntityResolversCompilerPass.php +++ b/core/modules/serialization/src/RegisterEntityResolversCompilerPass.php @@ -24,6 +24,7 @@ class RegisterEntityResolversCompilerPass implements CompilerPassInterface { */ public function process(ContainerBuilder $container) { $definition = $container->getDefinition('serializer.entity_resolver'); + $resolvers = array(); // Retrieve registered Normalizers and Encoders from the container. foreach ($container->findTaggedServiceIds('entity_resolver') as $id => $attributes) { @@ -32,8 +33,8 @@ public function process(ContainerBuilder $container) { } // Add the registered concrete EntityResolvers to the ChainEntityResolver. - if (!empty($resolvers)) { - $definition->replaceArgument(0, $this->sort($resolvers)); + foreach ($this->sort($resolvers) as $resolver) { + $definition->addMethodCall('addResolver', array($resolver)); } } diff --git a/core/modules/serialization/tests/src/EntityResolver/ChainEntityResolverTest.php b/core/modules/serialization/tests/src/EntityResolver/ChainEntityResolverTest.php index 0f05311..5adac69 100644 --- a/core/modules/serialization/tests/src/EntityResolver/ChainEntityResolverTest.php +++ b/core/modules/serialization/tests/src/EntityResolver/ChainEntityResolverTest.php @@ -47,6 +47,9 @@ public function setUp() { /** * Test the resolve method with no matching resolvers. + * + * @covers ::__construct + * @covers ::resolve */ public function testResolverWithNoneResolved() { $resolvers = array( @@ -60,7 +63,24 @@ public function testResolverWithNoneResolved() { } /** + * Test the resolve method with no matching resolvers, using addResolver. + * + * @covers ::addResolver + * @covers ::resolve + */ + public function testResolverWithNoneResolvedUsingAddResolver() { + $resolver = new ChainEntityResolver(); + $resolver->addResolver($this->createEntityResolverMock()); + $resolver->addResolver($this->createEntityResolverMock()); + + $this->assertNull($resolver->resolve($this->testNormalizer, $this->testData, $this->testEntityType)); + } + + /** * Test the resolve method with a matching resolver first. + * + * @covers ::__construct + * @covers ::resolve */ public function testResolverWithFirstResolved() { $resolvers = array( @@ -75,6 +95,9 @@ public function testResolverWithFirstResolved() { /** * Test the resolve method with a matching resolver last. + * + * @covers ::__construct + * @covers ::resolve */ public function testResolverWithLastResolved() { $resolvers = array( @@ -97,7 +120,7 @@ public function testResolverWithLastResolved() { * Whether or not the resolve method is expected to be called. * * @return \Drupal\serialization\EntityResolver\EntityResolverInterface|\PHPUnit_Framework_MockObject_MockObject - * The mocked entity ressolver. + * The mocked entity resolver. */ protected function createEntityResolverMock($return = NULL, $called = TRUE) { $mock = $this->getMock('Drupal\serialization\EntityResolver\EntityResolverInterface');