From a59fd33532a7db3ad9dda2e4da472515c42bcd66 Mon Sep 17 00:00:00 2001 From: Pierre Ambroise Date: Fri, 28 Feb 2025 23:36:16 +0100 Subject: [PATCH] Register mercure hub services in Turbo --- .../Mercure/TurboStreamListenRenderer.php | 17 ++++--- .../Compiler/RegisterMercureHubs.php | 51 +++++++++++++++++++ src/Turbo/src/TurboBundle.php | 3 ++ 3 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 src/Turbo/src/DependencyInjection/Compiler/RegisterMercureHubs.php diff --git a/src/Turbo/src/Bridge/Mercure/TurboStreamListenRenderer.php b/src/Turbo/src/Bridge/Mercure/TurboStreamListenRenderer.php index 3782cd9d363..a5e511ca9e7 100644 --- a/src/Turbo/src/Bridge/Mercure/TurboStreamListenRenderer.php +++ b/src/Turbo/src/Bridge/Mercure/TurboStreamListenRenderer.php @@ -11,8 +11,6 @@ namespace Symfony\UX\Turbo\Bridge\Mercure; -use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\Mercure\Authorization; use Symfony\Component\Mercure\HubInterface; use Symfony\Component\Mercure\Twig\MercureExtension; use Symfony\UX\StimulusBundle\Helper\StimulusHelper; @@ -20,6 +18,7 @@ use Symfony\UX\Turbo\Twig\TurboStreamListenRendererWithOptionsInterface; use Symfony\WebpackEncoreBundle\Twig\StimulusTwigExtension; use Twig\Environment; +use Twig\Error\RuntimeError; /** * Renders the attributes to load the "mercure-turbo-stream" controller. @@ -64,12 +63,14 @@ public function renderTurboStreamListen(Environment $env, $topic /* array $event } if (isset($eventSourceOptions)) { - if ($mercure = $this->twig->getExtension(MercureExtension::class)) { - $mercure->mercure($topic, $eventSourceOptions); - } - - if (isset($eventSourceOptions['withCredentials'])) { - $controllerAttributes['withCredentials'] = $eventSourceOptions['withCredentials']; + try { + $mercure = $this->twig->getExtension(MercureExtension::class); + $mercure->mercure($topics, $eventSourceOptions); + + if (isset($eventSourceOptions['withCredentials'])) { + $controllerAttributes['withCredentials'] = $eventSourceOptions['withCredentials']; + } + } catch (RuntimeError $e) { } } diff --git a/src/Turbo/src/DependencyInjection/Compiler/RegisterMercureHubs.php b/src/Turbo/src/DependencyInjection/Compiler/RegisterMercureHubs.php new file mode 100644 index 00000000000..3cc769f7f26 --- /dev/null +++ b/src/Turbo/src/DependencyInjection/Compiler/RegisterMercureHubs.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Turbo\DependencyInjection\Compiler; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\UX\Turbo\Bridge\Mercure\Broadcaster; +use Symfony\UX\Turbo\Bridge\Mercure\TurboStreamListenRenderer; + +/** + * This compiler pass ensures that TurboStreamListenRenderer + * and Broadcast are registered per Mercure hub. + * + * @author Pierre Ambroise + */ +final class RegisterMercureHubs implements CompilerPassInterface +{ + public function process(ContainerBuilder $container) + { + foreach ($container->findTaggedServiceIds('mercure.hub') as $hubId => $tag) { + $name = str_replace('mercure.hub.', '', $hubId); + + $container->register("turbo.mercure.$name.renderer", TurboStreamListenRenderer::class) + ->addArgument(new Reference($hubId)) + ->addArgument(new Reference('turbo.mercure.stimulus_helper')) + ->addArgument(new Reference('turbo.id_accessor')) + ->addArgument(new Reference('twig')) + ->addTag('turbo.renderer.stream_listen', ['transport' => $name]); + + if (isset($tag['default']) && $tag['default']) { + $container->getDefinition("turbo.mercure.{$name}.renderer") + ->addTag('turbo.renderer.stream_listen', ['transport' => 'default']); + } + + $container->register("turbo.mercure.$name.broadcaster", Broadcaster::class) + ->addArgument($name) + ->addArgument(new Reference($hubId)) + ->addTag('turbo.broadcaster'); + } + } +} diff --git a/src/Turbo/src/TurboBundle.php b/src/Turbo/src/TurboBundle.php index e1524e4ba34..e5e4efd69d0 100644 --- a/src/Turbo/src/TurboBundle.php +++ b/src/Turbo/src/TurboBundle.php @@ -15,6 +15,7 @@ use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; +use Symfony\UX\Turbo\DependencyInjection\Compiler\RegisterMercureHubs; /** * @author Kévin Dunglas @@ -28,6 +29,8 @@ public function build(ContainerBuilder $container): void { parent::build($container); + $container->addCompilerPass(new RegisterMercureHubs()); + $container->addCompilerPass(new class implements CompilerPassInterface { public function process(ContainerBuilder $container): void {