2525 */
2626final class ComponentFactory implements ResetInterface
2727{
28- private static array $ mountMethods = [];
28+ private array $ mountMethods = [];
2929
3030 /**
3131 * @param array<string, array> $config
3232 * @param array<class-string, string> $classMap
33- * @param array<class-string, array<string, string[]> $classMounts
3433 */
3534 public function __construct (
3635 private ComponentTemplateFinderInterface $ componentTemplateFinder ,
3736 private ServiceLocator $ components ,
3837 private PropertyAccessorInterface $ propertyAccessor ,
3938 private EventDispatcherInterface $ eventDispatcher ,
4039 private array $ config ,
41- private array $ classMap ,
40+ private readonly array $ classMap ,
4241 ) {
4342 }
4443
@@ -88,29 +87,29 @@ public function create(string $name, array $data = []): MountedComponent
8887 public function mountFromObject (object $ component , array $ data , ComponentMetadata $ componentMetadata ): MountedComponent
8988 {
9089 $ originalData = $ data ;
91- $ data = $ this ->preMount ($ component , $ data , $ componentMetadata );
90+ $ event = $ this ->preMount ($ component , $ data , $ componentMetadata );
91+ $ data = $ event ->getData ();
9292
9393 $ this ->mount ($ component , $ data , $ componentMetadata );
9494
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+ }
101102 }
102103 }
103104
104105 $ postMount = $ this ->postMount ($ component , $ data , $ componentMetadata );
105- $ data = $ postMount ['data ' ];
106- $ extraMetadata = $ postMount ['extraMetadata ' ];
106+ $ data = $ postMount ->getData ();
107107
108108 // create attributes from "attributes" key if exists
109109 $ attributesVar = $ componentMetadata ->getAttributesVar ();
110110 $ attributes = $ data [$ attributesVar ] ?? [];
111111 unset($ data [$ attributesVar ]);
112112
113- // ensure remaining data is scalar
114113 foreach ($ data as $ key => $ value ) {
115114 if ($ value instanceof \Stringable) {
116115 $ data [$ key ] = (string ) $ value ;
@@ -120,9 +119,9 @@ public function mountFromObject(object $component, array $data, ComponentMetadat
120119 return new MountedComponent (
121120 $ componentMetadata ->getName (),
122121 $ component ,
123- new ComponentAttributes (array_merge ( $ attributes , $ data) ),
122+ new ComponentAttributes ([... $ attributes , ... $ data] ),
124123 $ originalData ,
125- $ extraMetadata ,
124+ $ postMount -> getExtraMetadata () ,
126125 );
127126 }
128127
@@ -154,7 +153,7 @@ private function mount(object $component, array &$data, ComponentMetadata $compo
154153 return ;
155154 }
156155
157- $ mount = self :: $ mountMethods [$ component ::class] ??= (new \ReflectionClass ($ component ))->getMethod ('mount ' );
156+ $ mount = $ this -> mountMethods [$ component ::class] ??= (new \ReflectionClass ($ component ))->getMethod ('mount ' );
158157
159158 $ parameters = [];
160159 foreach ($ mount ->getParameters () as $ refParameter ) {
@@ -172,40 +171,34 @@ private function mount(object $component, array &$data, ComponentMetadata $compo
172171 $ mount ->invoke ($ component , ...$ parameters );
173172 }
174173
175- private function preMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): array
174+ private function preMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): PreMountEvent
176175 {
177176 $ event = new PreMountEvent ($ component , $ data , $ componentMetadata );
178177 $ this ->eventDispatcher ->dispatch ($ event );
179- $ data = $ event ->getData ();
180178
179+ $ data = $ event ->getData ();
181180 foreach ($ componentMetadata ->getPreMounts () as $ preMount ) {
182181 if (null !== $ newData = $ component ->$ preMount ($ data )) {
183- $ data = $ newData ;
182+ $ event -> setData ( $ data = $ newData) ;
184183 }
185184 }
186185
187- return $ data ;
186+ return $ event ;
188187 }
189188
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
194190 {
195191 $ event = new PostMountEvent ($ component , $ data , $ componentMetadata );
196192 $ this ->eventDispatcher ->dispatch ($ event );
197- $ data = $ event ->getData ();
198193
194+ $ data = $ event ->getData ();
199195 foreach ($ componentMetadata ->getPostMounts () as $ postMount ) {
200196 if (null !== $ newData = $ component ->$ postMount ($ data )) {
201- $ data = $ newData ;
197+ $ event -> setData ( $ data = $ newData) ;
202198 }
203199 }
204200
205- return [
206- 'data ' => $ data ,
207- 'extraMetadata ' => $ event ->getExtraMetadata (),
208- ];
201+ return $ event ;
209202 }
210203
211204 /**
@@ -244,6 +237,6 @@ private function throwUnknownComponentException(string $name): void
244237
245238 public function reset (): void
246239 {
247- self :: $ mountMethods = [];
240+ $ this -> mountMethods = [];
248241 }
249242}
0 commit comments