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,22 +87,23 @@ 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 ();
@@ -120,9 +120,9 @@ public function mountFromObject(object $component, array $data, ComponentMetadat
120
120
return new MountedComponent (
121
121
$ componentMetadata ->getName (),
122
122
$ component ,
123
- new ComponentAttributes (array_merge ( $ attributes , $ data) ),
123
+ new ComponentAttributes ([... $ attributes , ... $ data] ),
124
124
$ originalData ,
125
- $ extraMetadata ,
125
+ $ postMount -> getExtraMetadata () ,
126
126
);
127
127
}
128
128
@@ -154,7 +154,7 @@ private function mount(object $component, array &$data, ComponentMetadata $compo
154
154
return ;
155
155
}
156
156
157
- $ mount = self :: $ mountMethods [$ component ::class] ??= (new \ReflectionClass ($ component ))->getMethod ('mount ' );
157
+ $ mount = $ this -> mountMethods [$ component ::class] ??= (new \ReflectionClass ($ component ))->getMethod ('mount ' );
158
158
159
159
$ parameters = [];
160
160
foreach ($ mount ->getParameters () as $ refParameter ) {
@@ -172,40 +172,34 @@ private function mount(object $component, array &$data, ComponentMetadata $compo
172
172
$ mount ->invoke ($ component , ...$ parameters );
173
173
}
174
174
175
- private function preMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): array
175
+ private function preMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): PreMountEvent
176
176
{
177
177
$ event = new PreMountEvent ($ component , $ data , $ componentMetadata );
178
178
$ this ->eventDispatcher ->dispatch ($ event );
179
- $ data = $ event ->getData ();
180
179
180
+ $ data = $ event ->getData ();
181
181
foreach ($ componentMetadata ->getPreMounts () as $ preMount ) {
182
182
if (null !== $ newData = $ component ->$ preMount ($ data )) {
183
- $ data = $ newData ;
183
+ $ event -> setData ( $ data = $ newData) ;
184
184
}
185
185
}
186
186
187
- return $ data ;
187
+ return $ event ;
188
188
}
189
189
190
- /**
191
- * @return array{data: array<string, mixed>, extraMetadata: array<string, mixed>}
192
- */
193
- private function postMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): array
190
+ private function postMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): PostMountEvent
194
191
{
195
192
$ event = new PostMountEvent ($ component , $ data , $ componentMetadata );
196
193
$ this ->eventDispatcher ->dispatch ($ event );
197
- $ data = $ event ->getData ();
198
194
195
+ $ data = $ event ->getData ();
199
196
foreach ($ componentMetadata ->getPostMounts () as $ postMount ) {
200
197
if (null !== $ newData = $ component ->$ postMount ($ data )) {
201
- $ data = $ newData ;
198
+ $ event -> setData ( $ data = $ newData) ;
202
199
}
203
200
}
204
201
205
- return [
206
- 'data ' => $ data ,
207
- 'extraMetadata ' => $ event ->getExtraMetadata (),
208
- ];
202
+ return $ event ;
209
203
}
210
204
211
205
/**
@@ -244,6 +238,6 @@ private function throwUnknownComponentException(string $name): void
244
238
245
239
public function reset (): void
246
240
{
247
- self :: $ mountMethods = [];
241
+ $ this -> mountMethods = [];
248
242
}
249
243
}
0 commit comments