11
11
12
12
namespace Symfony \UX \LiveComponent \EventListener ;
13
13
14
+ use Psr \Container \ContainerInterface ;
14
15
use Symfony \Component \EventDispatcher \EventSubscriberInterface ;
15
16
use Symfony \Component \HttpKernel \Event \ResponseEvent ;
16
17
use Symfony \Component \HttpKernel \KernelEvents ;
17
18
use Symfony \Component \Routing \Exception \ResourceNotFoundException ;
18
19
use Symfony \Component \Routing \RouterInterface ;
20
+ use Symfony \Contracts \Service \ServiceSubscriberInterface ;
19
21
use Symfony \UX \LiveComponent \LiveComponentHydrator ;
20
22
use Symfony \UX \LiveComponent \Metadata \LiveComponentMetadataFactory ;
21
23
use Symfony \UX \TwigComponent \MountedComponent ;
22
24
23
25
/**
24
26
* @internal
25
27
*/
26
- class LiveUrlSubscriber implements EventSubscriberInterface
28
+ class LiveUrlSubscriber implements EventSubscriberInterface, ServiceSubscriberInterface
27
29
{
28
30
private const URL_HEADER = 'X-Live-Url ' ;
29
31
30
32
public function __construct (
31
- private LiveComponentMetadataFactory $ metadataFactory ,
32
- private LiveComponentHydrator $ liveComponentHydrator ,
33
- private RouterInterface $ router ,
33
+ private ContainerInterface $ container ,
34
34
) {
35
35
}
36
36
37
+ public static function getSubscribedServices (): array
38
+ {
39
+ return [
40
+ LiveComponentMetadataFactory::class,
41
+ LiveComponentHydrator::class,
42
+ RouterInterface::class,
43
+ ];
44
+ }
45
+
37
46
public function onKernelResponse (ResponseEvent $ event ): void
38
47
{
39
48
$ request = $ event ->getRequest ();
@@ -68,10 +77,10 @@ private function extractUrlLiveProps(MountedComponent $mounted): array
68
77
{
69
78
$ pathProps = $ queryProps = [];
70
79
71
- $ mountedMetadata = $ this ->metadataFactory ->getMetadata ($ mounted ->getName ());
80
+ $ mountedMetadata = $ this ->getMetadataFactory () ->getMetadata ($ mounted ->getName ());
72
81
73
82
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 );
75
84
$ props = $ dehydratedProps ->getProps ();
76
85
77
86
foreach ($ urlMappings as $ name => $ urlMapping ) {
@@ -95,14 +104,15 @@ private function generateNewLiveUrl(string $previousUrl, array $pathProps, array
95
104
$ newQueryString = $ previousUrlParsed ['query ' ] ?? '' ;
96
105
97
106
if ([] !== $ pathProps ) {
98
- $ context = $ this ->router ->getContext ();
107
+ $ router = $ this ->getRouter ();
108
+ $ context = $ router ->getContext ();
99
109
try {
100
110
// Re-create a context for the URL rendering the current LiveComponent
101
111
$ tmpContext = clone $ context ;
102
112
$ tmpContext ->setMethod ('GET ' );
103
- $ this -> router ->setContext ($ tmpContext );
113
+ $ router ->setContext ($ tmpContext );
104
114
105
- $ routeMatched = $ this -> router ->match ($ previousUrlParsed ['path ' ]);
115
+ $ routeMatched = $ router ->match ($ previousUrlParsed ['path ' ]);
106
116
$ routeParams = [];
107
117
foreach ($ routeMatched as $ k => $ v ) {
108
118
if ('_route ' === $ k || '_controller ' === $ k ) {
@@ -111,11 +121,11 @@ private function generateNewLiveUrl(string $previousUrl, array $pathProps, array
111
121
$ routeParams [$ k ] = \array_key_exists ($ k , $ pathProps ) ? $ pathProps [$ k ] : $ v ;
112
122
}
113
123
114
- $ newUrl = $ this -> router ->generate ($ routeMatched ['_route ' ], $ routeParams );
124
+ $ newUrl = $ router ->generate ($ routeMatched ['_route ' ], $ routeParams );
115
125
} catch (ResourceNotFoundException ) {
116
126
// reuse the previous URL path
117
127
} finally {
118
- $ this -> router ->setContext ($ context );
128
+ $ router ->setContext ($ context );
119
129
}
120
130
}
121
131
@@ -131,4 +141,19 @@ private function generateNewLiveUrl(string $previousUrl, array $pathProps, array
131
141
132
142
return $ newUrl .($ newQueryString ? '? ' .$ newQueryString : '' );
133
143
}
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
+ }
134
159
}
0 commit comments