12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
- use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
- use Symfony\Component\DependencyInjection\ContainerBuilder;
- use Symfony\Component\DependencyInjection\Reference;
- /**
- * Adds all services with the tags "serializer.encoder" and "serializer.normalizer" as
- * encoders and normalizers to the Serializer service.
- *
- * @author Javier Lopez <f12loalf@gmail.com>
- */
- class SerializerPass implements CompilerPassInterface
- {
- public function process(ContainerBuilder $container)
- {
- if (!$container->hasDefinition('serializer')) {
- return;
- }
- // Looks for all the services tagged "serializer.normalizer" and adds them to the Serializer service
- $normalizers = $this->findAndSortTaggedServices('serializer.normalizer', $container);
- $container->getDefinition('serializer')->replaceArgument(0, $normalizers);
- // Looks for all the services tagged "serializer.encoders" and adds them to the Serializer service
- $encoders = $this->findAndSortTaggedServices('serializer.encoder', $container);
- $container->getDefinition('serializer')->replaceArgument(1, $encoders);
- }
- /**
- * Finds all services with the given tag name and order them by their priority.
- *
- * @param string $tagName
- * @param ContainerBuilder $container
- *
- * @return array
- *
- * @throws \RuntimeException
- */
- private function findAndSortTaggedServices($tagName, ContainerBuilder $container)
- {
- $services = $container->findTaggedServiceIds($tagName);
- if (empty($services)) {
- throw new \RuntimeException(sprintf('You must tag at least one service as "%s" to use the Serializer service', $tagName));
- }
- $sortedServices = array();
- foreach ($services as $serviceId => $attributes) {
- $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
- $sortedServices[$priority][] = new Reference($serviceId);
- }
- krsort($sortedServices);
- // Flatten the array
- return \call_user_func_array('array_merge', $sortedServices);
- }
- }
|