1111
1212namespace Symfony \UX \LiveComponent \EventListener ;
1313
14+ use Psr \Container \ContainerInterface ;
1415use Symfony \Component \EventDispatcher \EventSubscriberInterface ;
1516use Symfony \Component \HttpKernel \Event \ResponseEvent ;
1617use Symfony \Component \HttpKernel \KernelEvents ;
1718use Symfony \Component \Routing \Exception \ResourceNotFoundException ;
1819use Symfony \Component \Routing \RouterInterface ;
20+ use Symfony \Contracts \Service \ServiceSubscriberInterface ;
1921use Symfony \UX \LiveComponent \LiveComponentHydrator ;
2022use Symfony \UX \LiveComponent \Metadata \LiveComponentMetadataFactory ;
2123use Symfony \UX \TwigComponent \MountedComponent ;
2224
2325/**
2426 * @internal
2527 */
26- class LiveUrlSubscriber implements EventSubscriberInterface
28+ class LiveUrlSubscriber implements EventSubscriberInterface, ServiceSubscriberInterface
2729{
2830 private const URL_HEADER = 'X-Live-Url ' ;
2931
3032 public function __construct (
31- private LiveComponentMetadataFactory $ metadataFactory ,
32- private LiveComponentHydrator $ liveComponentHydrator ,
33- private RouterInterface $ router ,
33+ private ContainerInterface $ container ,
3434 ) {
3535 }
3636
37+ public static function getSubscribedServices (): array
38+ {
39+ return [
40+ LiveComponentMetadataFactory::class,
41+ LiveComponentHydrator::class,
42+ RouterInterface::class,
43+ ];
44+ }
45+
3746 public function onKernelResponse (ResponseEvent $ event ): void
3847 {
3948 $ request = $ event ->getRequest ();
@@ -68,10 +77,10 @@ private function extractUrlLiveProps(MountedComponent $mounted): array
6877 {
6978 $ pathProps = $ queryProps = [];
7079
71- $ mountedMetadata = $ this ->metadataFactory ->getMetadata ($ mounted ->getName ());
80+ $ mountedMetadata = $ this ->getMetadataFactory () ->getMetadata ($ mounted ->getName ());
7281
7382 if ([] !== $ urlMappings = $ mountedMetadata ->getAllUrlMappings ($ mounted ->getComponent ())) {
74- $ dehydratedProps = $ this ->liveComponentHydrator ->dehydrate ($ mounted ->getComponent (), $ mounted ->getAttributes (), $ mountedMetadata );
83+ $ dehydratedProps = $ this ->getLiveComponentHydrator () ->dehydrate ($ mounted ->getComponent (), $ mounted ->getAttributes (), $ mountedMetadata );
7584 $ props = $ dehydratedProps ->getProps ();
7685
7786 foreach ($ urlMappings as $ name => $ urlMapping ) {
@@ -95,14 +104,15 @@ private function generateNewLiveUrl(string $previousUrl, array $pathProps, array
95104 $ newQueryString = $ previousUrlParsed ['query ' ] ?? '' ;
96105
97106 if ([] !== $ pathProps ) {
98- $ context = $ this ->router ->getContext ();
107+ $ router = $ this ->getRouter ();
108+ $ context = $ router ->getContext ();
99109 try {
100110 // Re-create a context for the URL rendering the current LiveComponent
101111 $ tmpContext = clone $ context ;
102112 $ tmpContext ->setMethod ('GET ' );
103- $ this -> router ->setContext ($ tmpContext );
113+ $ router ->setContext ($ tmpContext );
104114
105- $ routeMatched = $ this -> router ->match ($ previousUrlParsed ['path ' ]);
115+ $ routeMatched = $ router ->match ($ previousUrlParsed ['path ' ]);
106116 $ routeParams = [];
107117 foreach ($ routeMatched as $ k => $ v ) {
108118 if ('_route ' === $ k || '_controller ' === $ k ) {
@@ -111,11 +121,11 @@ private function generateNewLiveUrl(string $previousUrl, array $pathProps, array
111121 $ routeParams [$ k ] = \array_key_exists ($ k , $ pathProps ) ? $ pathProps [$ k ] : $ v ;
112122 }
113123
114- $ newUrl = $ this -> router ->generate ($ routeMatched ['_route ' ], $ routeParams );
124+ $ newUrl = $ router ->generate ($ routeMatched ['_route ' ], $ routeParams );
115125 } catch (ResourceNotFoundException ) {
116126 // reuse the previous URL path
117127 } finally {
118- $ this -> router ->setContext ($ context );
128+ $ router ->setContext ($ context );
119129 }
120130 }
121131
@@ -131,4 +141,19 @@ private function generateNewLiveUrl(string $previousUrl, array $pathProps, array
131141
132142 return $ newUrl .($ newQueryString ? '? ' .$ newQueryString : '' );
133143 }
144+
145+ private function getMetadataFactory (): LiveComponentMetadataFactory
146+ {
147+ return $ this ->container ->get (LiveComponentMetadataFactory::class);
148+ }
149+
150+ private function getLiveComponentHydrator (): LiveComponentHydrator
151+ {
152+ return $ this ->container ->get (LiveComponentHydrator::class);
153+ }
154+
155+ private function getRouter (): RouterInterface
156+ {
157+ return $ this ->container ->get (RouterInterface::class);
158+ }
134159}
0 commit comments