diff --git a/core/modules/serialization/serialization.services.yml b/core/modules/serialization/serialization.services.yml index bc491e6bd1a111a430d80642f936ebb7086d97c9..389ac0564c679c3acc1f4d17e73908bd7f7c4288 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 8127c7931e8aa4faf9b1ad3eba6570760e3d0b07..e1291c1d286cd4fa6f5e6d22520cadf86cc1419b 100644 --- a/core/modules/serialization/src/EntityResolver/ChainEntityResolver.php +++ b/core/modules/serialization/src/EntityResolver/ChainEntityResolver.php @@ -12,14 +12,14 @@ /** * Resolver delegating the entity resolution to a chain of resolvers. */ -class ChainEntityResolver implements EntityResolverInterface { +class ChainEntityResolver implements ChainEntityResolverInterface { /** * The concrete resolvers. * * @var \Drupal\serialization\EntityResolver\EntityResolverInterface[] */ - protected $resolvers; + protected $resolvers = array(); /** * Constructs a ChainEntityResolver object. @@ -31,6 +31,13 @@ public function __construct(array $resolvers = array()) { $this->resolvers = $resolvers; } + /** + * {@inheritdoc} + */ + public function addResolver(EntityResolverInterface $resolver) { + $this->resolvers[] = $resolver; + } + /** * {@inheritdoc} */ diff --git a/core/modules/serialization/src/EntityResolver/ChainEntityResolverInterface.php b/core/modules/serialization/src/EntityResolver/ChainEntityResolverInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..16dcfc05b4e8e32e8e3f3fc6d100f119cf8f187e --- /dev/null +++ b/core/modules/serialization/src/EntityResolver/ChainEntityResolverInterface.php @@ -0,0 +1,23 @@ +<?php + +/** + * @file + * Contains \Drupal\serialization\EntityResolver\ChainEntityResolverInterface + */ + +namespace Drupal\serialization\EntityResolver; + +/** + * An interface for delegating a entity resolution to a chain of resolvers. + */ +interface ChainEntityResolverInterface extends EntityResolverInterface { + + /** + * Adds an entity resolver. + * + * @param \Drupal\serialization\EntityResolver\EntityResolverInterface $resolver + * The entity resolver to add. + */ + public function addResolver(EntityResolverInterface $resolver); + +} diff --git a/core/modules/serialization/src/RegisterEntityResolversCompilerPass.php b/core/modules/serialization/src/RegisterEntityResolversCompilerPass.php index 6399f500b0d3a81e3bcb69ad8842649fa61d8c03..60e45ebb4e2efd3ed2d9dd5efb60a2ed675fc373 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 0f05311fc567952ea18cfb8a5cd3c4605dd3f636..5adac69a347c14c18c1102eb2cd6b4a07874a642 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( @@ -59,8 +62,25 @@ public function testResolverWithNoneResolved() { $this->assertNull($resolver->resolve($this->testNormalizer, $this->testData, $this->testEntityType)); } + /** + * 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');