How symfony/ux-turbo works
Symfony UX Turbo connects Symfony-rendered pages and stream responses to Hotwire Turbo in the browser, and can broadcast entity changes to connected users. The main request path is a Symfony controller returning a page, frame, or Turbo Stream response that the browser applies; the live-update path collects Doctrine changes, renders broadcast actions, and dispatches updates through configured transports such as Mercure. Twig helpers and transport renderers support these flows. The tree and sampled source establish the main wiring; some behavior is documented but its implementation was not sampled.
Main entry points: src Turbo browser · TurboStreamResponse.php Stream response · BroadcastListener.php Doctrine lifecycle · TurboRuntime.php Twig runtime
Components 20
Symfony responses
- Frame handling
src/TurboFrame.php - Request listener
src/Request/RequestListener.php - Stream response
src/TurboStreamResponse.php - Stream markup
src/Helper/TurboStream.php - Twig helpers
src/Twig - Turbo templates
templates/components
Browser Turbo
- Turbo browser
assets/src - Mercure stream source
src/Bridge/Mercure/MercureStreamSourceRenderer.php
Entity broadcasts
- Doctrine lifecycle
src/Doctrine/BroadcastListener.php - Broadcast settings
src/Attribute/Broadcast.php - Broadcaster interface
src/Broadcaster/BroadcasterInterface.php - Broadcaster dispatch
src/Broadcaster/ImuxBroadcaster.php - Twig action renderer
src/Broadcaster/TwigBroadcaster.php - Mercure broadcaster
src/Bridge/Mercure/Broadcaster.php
Bundle integration
- Mercure listen renderer
src/Bridge/Mercure/TurboStreamListenRenderer.php - Twig runtime
src/Twig/TurboRuntime.php - Bundle configuration
src/DependencyInjection/TurboExtension.php
Other components
- User
- Symfony controller
- Mercure hub
Connections 22
- User → Symfony controller: requests page
- Symfony controller → Frame handling: checks frame
- Symfony controller → Stream response: returns stream
- Stream response → Stream markup: builds markup
- Symfony controller → Twig helpers: renders page
- Twig helpers → Turbo templates: renders components
- Request listener → Symfony controller: sets request format
- Stream response → Turbo browser: returns stream HTML
- Turbo templates → Turbo browser: serves HTML
- Turbo browser → User: updates interface
- Doctrine lifecycle → Broadcast settings: reads settings
- Doctrine lifecycle → Broadcaster interface: broadcasts changes
- Broadcaster dispatch → Broadcaster interface: implements dispatch
- Twig action renderer → Broadcaster dispatch: decorates dispatch
- Twig action renderer → Mercure broadcaster: renders actions
- Mercure broadcaster → Mercure hub: publishes update
- Twig runtime → Mercure listen renderer: renders listener
- Twig runtime → Mercure stream source: renders source
- Mercure listen renderer → Turbo browser: provides listen markup
- Mercure stream source → Turbo browser: provides source markup
- Bundle configuration → Twig runtime: configures services
- Bundle configuration → Doctrine lifecycle: registers listener