| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- <?php
- namespace Drupal\serialization;
- use Symfony\Component\DependencyInjection\Reference;
- use Symfony\Component\DependencyInjection\ContainerBuilder;
- use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
- /**
- * Adds services tagged 'normalizer' and 'encoder' to the Serializer.
- */
- class RegisterEntityResolversCompilerPass implements CompilerPassInterface {
- /**
- * Adds services to the Serializer.
- *
- * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
- * The container to process.
- */
- public function process(ContainerBuilder $container) {
- $definition = $container->getDefinition('serializer.entity_resolver');
- $resolvers = [];
- // Retrieve registered Normalizers and Encoders from the container.
- foreach ($container->findTaggedServiceIds('entity_resolver') as $id => $attributes) {
- $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
- $resolvers[$priority][] = new Reference($id);
- }
- // Add the registered concrete EntityResolvers to the ChainEntityResolver.
- foreach ($this->sort($resolvers) as $resolver) {
- $definition->addMethodCall('addResolver', [$resolver]);
- }
- }
- /**
- * Sorts by priority.
- *
- * Order services from highest priority number to lowest (reverse sorting).
- *
- * @param array $services
- * A nested array keyed on priority number. For each priority number, the
- * value is an array of Symfony\Component\DependencyInjection\Reference
- * objects, each a reference to a normalizer or encoder service.
- *
- * @return array
- * A flattened array of Reference objects from $services, ordered from high
- * to low priority.
- */
- protected function sort($services) {
- $sorted = [];
- krsort($services);
- // Flatten the array.
- foreach ($services as $a) {
- $sorted = array_merge($sorted, $a);
- }
- return $sorted;
- }
- }
|