vendor/ibexa/twig-components/src/lib/Component/Renderer/DefaultRenderer.php line 37

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. declare(strict_types=1);
  7. namespace Ibexa\TwigComponents\Component\Renderer;
  8. use Ibexa\Contracts\TwigComponents\Event\RenderGroupEvent;
  9. use Ibexa\Contracts\TwigComponents\Event\RenderSingleEvent;
  10. use Ibexa\Contracts\TwigComponents\Exception\InvalidArgumentException;
  11. use Ibexa\Contracts\TwigComponents\Renderer\RendererInterface;
  12. use Ibexa\TwigComponents\Component\Registry;
  13. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  14. final class DefaultRenderer implements RendererInterface
  15. {
  16. private Registry $registry;
  17. private EventDispatcherInterface $eventDispatcher;
  18. public function __construct(
  19. Registry $registry,
  20. EventDispatcherInterface $eventDispatcher
  21. ) {
  22. $this->registry = $registry;
  23. $this->eventDispatcher = $eventDispatcher;
  24. }
  25. /**
  26. * @param array<mixed> $parameters
  27. *
  28. * @return string[]
  29. */
  30. public function renderGroup(string $groupName, array $parameters = []): array
  31. {
  32. $this->eventDispatcher->dispatch(new RenderGroupEvent(
  33. $this->registry,
  34. $groupName,
  35. $parameters
  36. ), RenderGroupEvent::class);
  37. $components = $this->registry->getComponents($groupName);
  38. $rendered = [];
  39. foreach ($components as $name => $component) {
  40. $rendered[] = $this->renderSingleWithComponents($groupName, $name, $components, $parameters);
  41. }
  42. return $rendered;
  43. }
  44. /**
  45. * @param array<mixed> $parameters
  46. */
  47. public function renderSingle(string $groupName, string $name, array $parameters = []): string
  48. {
  49. $components = $this->registry->getComponents($groupName);
  50. return $this->renderSingleWithComponents($groupName, $name, $components, $parameters);
  51. }
  52. /**
  53. * @param array<mixed> $parameters
  54. * @param array<string, \Ibexa\Contracts\TwigComponents\ComponentInterface> $components
  55. */
  56. private function renderSingleWithComponents(
  57. string $groupName,
  58. string $name,
  59. array $components,
  60. array $parameters = []
  61. ): string {
  62. $this->eventDispatcher->dispatch(new RenderSingleEvent(
  63. $this->registry,
  64. $groupName,
  65. $name,
  66. $parameters
  67. ), RenderSingleEvent::class);
  68. if (!isset($components[$name])) {
  69. throw new InvalidArgumentException(
  70. 'id',
  71. sprintf("Can't find Component '%s' in group '%s'", $name, $groupName),
  72. );
  73. }
  74. return $components[$name]->render($parameters);
  75. }
  76. }