3 namespace Drupal\serialization;
5 use Symfony\Component\DependencyInjection\Reference;
6 use Symfony\Component\DependencyInjection\ContainerBuilder;
7 use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
10 * Adds services tagged 'normalizer' and 'encoder' to the Serializer.
12 class RegisterEntityResolversCompilerPass implements CompilerPassInterface {
15 * Adds services to the Serializer.
17 * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
18 * The container to process.
20 public function process(ContainerBuilder $container) {
21 $definition = $container->getDefinition('serializer.entity_resolver');
24 // Retrieve registered Normalizers and Encoders from the container.
25 foreach ($container->findTaggedServiceIds('entity_resolver') as $id => $attributes) {
26 $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
27 $resolvers[$priority][] = new Reference($id);
30 // Add the registered concrete EntityResolvers to the ChainEntityResolver.
31 foreach ($this->sort($resolvers) as $resolver) {
32 $definition->addMethodCall('addResolver', [$resolver]);
39 * Order services from highest priority number to lowest (reverse sorting).
41 * @param array $services
42 * A nested array keyed on priority number. For each priority number, the
43 * value is an array of Symfony\Component\DependencyInjection\Reference
44 * objects, each a reference to a normalizer or encoder service.
47 * A flattened array of Reference objects from $services, ordered from high
50 protected function sort($services) {
55 foreach ($services as $a) {
56 $sorted = array_merge($sorted, $a);