25
25
*/
26
26
final class ComponentFactory implements ResetInterface
27
27
{
28
- private static array $ mountMethods = [];
28
+ private array $ mountMethods = [];
29
29
30
30
/**
31
31
* @param array<string, array> $config
32
32
* @param array<class-string, string> $classMap
33
- * @param array<class-string, array<string, string[]> $classMounts
34
33
*/
35
34
public function __construct (
36
35
private ComponentTemplateFinderInterface $ componentTemplateFinder ,
37
36
private ServiceLocator $ components ,
38
37
private PropertyAccessorInterface $ propertyAccessor ,
39
38
private EventDispatcherInterface $ eventDispatcher ,
40
39
private array $ config ,
41
- private array $ classMap ,
40
+ private readonly array $ classMap ,
42
41
) {
43
42
}
44
43
@@ -88,29 +87,29 @@ public function create(string $name, array $data = []): MountedComponent
88
87
public function mountFromObject (object $ component , array $ data , ComponentMetadata $ componentMetadata ): MountedComponent
89
88
{
90
89
$ originalData = $ data ;
91
- $ data = $ this ->preMount ($ component , $ data , $ componentMetadata );
90
+ $ event = $ this ->preMount ($ component , $ data , $ componentMetadata );
91
+ $ data = $ event ->getData ();
92
92
93
93
$ this ->mount ($ component , $ data , $ componentMetadata );
94
94
95
- // set data that wasn't set in mount on the component directly
96
- foreach ($ data as $ property => $ value ) {
97
- if ($ this ->propertyAccessor ->isWritable ($ component , $ property )) {
98
- $ this ->propertyAccessor ->setValue ($ component , $ property , $ value );
99
-
100
- unset($ data [$ property ]);
95
+ if (!$ componentMetadata ->isAnonymous ()) {
96
+ // set data that wasn't set in mount on the component directly
97
+ foreach ($ data as $ property => $ value ) {
98
+ if ($ this ->propertyAccessor ->isWritable ($ component , $ property )) {
99
+ $ this ->propertyAccessor ->setValue ($ component , $ property , $ value );
100
+ unset($ data [$ property ]);
101
+ }
101
102
}
102
103
}
103
104
104
105
$ postMount = $ this ->postMount ($ component , $ data , $ componentMetadata );
105
- $ data = $ postMount ['data ' ];
106
- $ extraMetadata = $ postMount ['extraMetadata ' ];
106
+ $ data = $ postMount ->getData ();
107
107
108
108
// create attributes from "attributes" key if exists
109
109
$ attributesVar = $ componentMetadata ->getAttributesVar ();
110
110
$ attributes = $ data [$ attributesVar ] ?? [];
111
111
unset($ data [$ attributesVar ]);
112
112
113
- // ensure remaining data is scalar
114
113
foreach ($ data as $ key => $ value ) {
115
114
if ($ value instanceof \Stringable) {
116
115
$ data [$ key ] = (string ) $ value ;
@@ -120,9 +119,9 @@ public function mountFromObject(object $component, array $data, ComponentMetadat
120
119
return new MountedComponent (
121
120
$ componentMetadata ->getName (),
122
121
$ component ,
123
- new ComponentAttributes (array_merge ( $ attributes , $ data) ),
122
+ new ComponentAttributes ([... $ attributes , ... $ data] ),
124
123
$ originalData ,
125
- $ extraMetadata ,
124
+ $ postMount -> getExtraMetadata () ,
126
125
);
127
126
}
128
127
@@ -154,7 +153,7 @@ private function mount(object $component, array &$data, ComponentMetadata $compo
154
153
return ;
155
154
}
156
155
157
- $ mount = self :: $ mountMethods [$ component ::class] ??= (new \ReflectionClass ($ component ))->getMethod ('mount ' );
156
+ $ mount = $ this -> mountMethods [$ component ::class] ??= (new \ReflectionClass ($ component ))->getMethod ('mount ' );
158
157
159
158
$ parameters = [];
160
159
foreach ($ mount ->getParameters () as $ refParameter ) {
@@ -172,40 +171,34 @@ private function mount(object $component, array &$data, ComponentMetadata $compo
172
171
$ mount ->invoke ($ component , ...$ parameters );
173
172
}
174
173
175
- private function preMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): array
174
+ private function preMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): PreMountEvent
176
175
{
177
176
$ event = new PreMountEvent ($ component , $ data , $ componentMetadata );
178
177
$ this ->eventDispatcher ->dispatch ($ event );
179
- $ data = $ event ->getData ();
180
178
179
+ $ data = $ event ->getData ();
181
180
foreach ($ componentMetadata ->getPreMounts () as $ preMount ) {
182
181
if (null !== $ newData = $ component ->$ preMount ($ data )) {
183
- $ data = $ newData ;
182
+ $ event -> setData ( $ data = $ newData) ;
184
183
}
185
184
}
186
185
187
- return $ data ;
186
+ return $ event ;
188
187
}
189
188
190
- /**
191
- * @return array{data: array<string, mixed>, extraMetadata: array<string, mixed>}
192
- */
193
- private function postMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): array
189
+ private function postMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): PostMountEvent
194
190
{
195
191
$ event = new PostMountEvent ($ component , $ data , $ componentMetadata );
196
192
$ this ->eventDispatcher ->dispatch ($ event );
197
- $ data = $ event ->getData ();
198
193
194
+ $ data = $ event ->getData ();
199
195
foreach ($ componentMetadata ->getPostMounts () as $ postMount ) {
200
196
if (null !== $ newData = $ component ->$ postMount ($ data )) {
201
- $ data = $ newData ;
197
+ $ event -> setData ( $ data = $ newData) ;
202
198
}
203
199
}
204
200
205
- return [
206
- 'data ' => $ data ,
207
- 'extraMetadata ' => $ event ->getExtraMetadata (),
208
- ];
201
+ return $ event ;
209
202
}
210
203
211
204
/**
@@ -244,6 +237,6 @@ private function throwUnknownComponentException(string $name): void
244
237
245
238
public function reset (): void
246
239
{
247
- self :: $ mountMethods = [];
240
+ $ this -> mountMethods = [];
248
241
}
249
242
}
0 commit comments