FragmentRendererPass.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\HttpKernel\DependencyInjection;
  11. use Symfony\Component\DependencyInjection\ContainerBuilder;
  12. use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
  13. /**
  14. * Adds services tagged kernel.fragment_renderer as HTTP content rendering strategies.
  15. *
  16. * @author Fabien Potencier <fabien@symfony.com>
  17. */
  18. class FragmentRendererPass implements CompilerPassInterface
  19. {
  20. private $handlerService;
  21. private $rendererTag;
  22. /**
  23. * @param string $handlerService Service name of the fragment handler in the container
  24. * @param string $rendererTag Tag name used for fragments
  25. */
  26. public function __construct($handlerService = 'fragment.handler', $rendererTag = 'kernel.fragment_renderer')
  27. {
  28. $this->handlerService = $handlerService;
  29. $this->rendererTag = $rendererTag;
  30. }
  31. public function process(ContainerBuilder $container)
  32. {
  33. if (!$container->hasDefinition($this->handlerService)) {
  34. return;
  35. }
  36. $definition = $container->getDefinition($this->handlerService);
  37. foreach ($container->findTaggedServiceIds($this->rendererTag) as $id => $tags) {
  38. $def = $container->getDefinition($id);
  39. if (!$def->isPublic()) {
  40. throw new \InvalidArgumentException(sprintf('The service "%s" must be public as fragment renderer are lazy-loaded.', $id));
  41. }
  42. if ($def->isAbstract()) {
  43. throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as fragment renderer are lazy-loaded.', $id));
  44. }
  45. $class = $container->getParameterBag()->resolveValue($def->getClass());
  46. $interface = 'Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface';
  47. if (!is_subclass_of($class, $interface)) {
  48. if (!class_exists($class, false)) {
  49. throw new \InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
  50. }
  51. throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface));
  52. }
  53. foreach ($tags as $tag) {
  54. $definition->addMethodCall('addRendererService', array($tag['alias'], $id));
  55. }
  56. }
  57. }
  58. }