1515use Symfony \Component \DependencyInjection \ServiceLocator ;
1616use Symfony \Component \PropertyAccess \PropertyAccessorInterface ;
1717use Symfony \Contracts \Service \ResetInterface ;
18- use Symfony \UX \TwigComponent \Attribute \AsTwigComponent ;
1918use Symfony \UX \TwigComponent \Event \PostMountEvent ;
2019use Symfony \UX \TwigComponent \Event \PreMountEvent ;
2120
2625 */
2726final class ComponentFactory implements ResetInterface
2827{
29- private static $ mountMethods = [];
30- private static $ preMountMethods = [];
31- private static $ postMountMethods = [];
28+ private static array $ mountMethods = [];
3229
3330 /**
3431 * @param array<string, array> $config
3532 * @param array<class-string, string> $classMap
33+ * @param array<class-string, array<string, string[]> $classMounts
3634 */
3735 public function __construct (
3836 private ComponentTemplateFinderInterface $ componentTemplateFinder ,
@@ -92,7 +90,7 @@ public function mountFromObject(object $component, array $data, ComponentMetadat
9290 $ originalData = $ data ;
9391 $ data = $ this ->preMount ($ component , $ data , $ componentMetadata );
9492
95- $ this ->mount ($ component , $ data );
93+ $ this ->mount ($ component , $ data, $ componentMetadata );
9694
9795 // set data that wasn't set in mount on the component directly
9896 foreach ($ data as $ property => $ value ) {
@@ -144,30 +142,22 @@ public function get(string $name): object
144142 return $ this ->components ->get ($ metadata ->getName ());
145143 }
146144
147- private function mount (object $ component , array &$ data ): void
145+ private function mount (object $ component , array &$ data, ComponentMetadata $ componentMetadata ): void
148146 {
149147 if ($ component instanceof AnonymousComponent) {
150148 $ component ->mount ($ data );
151149
152150 return ;
153151 }
154152
155- if (null === (self ::$ mountMethods [$ component ::class] ?? null )) {
156- try {
157- $ mountMethod = self ::$ mountMethods [$ component ::class] = (new \ReflectionClass ($ component ))->getMethod ('mount ' );
158- } catch (\ReflectionException ) {
159- self ::$ mountMethods [$ component ::class] = false ;
160-
161- return ;
162- }
163- }
164-
165- if (false === $ mountMethod ??= self ::$ mountMethods [$ component ::class]) {
153+ if (!$ componentMetadata ->getMounts ()) {
166154 return ;
167155 }
168156
157+ $ mount = self ::$ mountMethods [$ component ::class] ??= (new \ReflectionClass ($ component ))->getMethod ('mount ' );
158+
169159 $ parameters = [];
170- foreach ($ mountMethod ->getParameters () as $ refParameter ) {
160+ foreach ($ mount ->getParameters () as $ refParameter ) {
171161 if (\array_key_exists ($ name = $ refParameter ->getName (), $ data )) {
172162 $ parameters [] = $ data [$ name ];
173163 // remove the data element so it isn't used to set the property directly.
@@ -179,7 +169,7 @@ private function mount(object $component, array &$data): void
179169 }
180170 }
181171
182- $ mountMethod ->invoke ($ component , ...$ parameters );
172+ $ mount ->invoke ($ component , ...$ parameters );
183173 }
184174
185175 private function preMount (object $ component , array $ data , ComponentMetadata $ componentMetadata ): array
@@ -188,9 +178,8 @@ private function preMount(object $component, array $data, ComponentMetadata $com
188178 $ this ->eventDispatcher ->dispatch ($ event );
189179 $ data = $ event ->getData ();
190180
191- $ methods = self ::$ preMountMethods [$ component ::class] ??= AsTwigComponent::preMountMethods ($ component ::class);
192- foreach ($ methods as $ method ) {
193- if (null !== $ newData = $ method ->invoke ($ component , $ data )) {
181+ foreach ($ componentMetadata ->getPreMounts () as $ preMount ) {
182+ if (null !== $ newData = $ component ->$ preMount ($ data )) {
194183 $ data = $ newData ;
195184 }
196185 }
@@ -207,9 +196,8 @@ private function postMount(object $component, array $data, ComponentMetadata $co
207196 $ this ->eventDispatcher ->dispatch ($ event );
208197 $ data = $ event ->getData ();
209198
210- $ methods = self ::$ postMountMethods [$ component ::class] ??= AsTwigComponent::postMountMethods ($ component ::class);
211- foreach ($ methods as $ method ) {
212- if (null !== $ newData = $ method ->invoke ($ component , $ data )) {
199+ foreach ($ componentMetadata ->getPostMounts () as $ postMount ) {
200+ if (null !== $ newData = $ component ->$ postMount ($ data )) {
213201 $ data = $ newData ;
214202 }
215203 }
@@ -257,7 +245,5 @@ private function throwUnknownComponentException(string $name): void
257245 public function reset (): void
258246 {
259247 self ::$ mountMethods = [];
260- self ::$ preMountMethods = [];
261- self ::$ postMountMethods = [];
262248 }
263249}
0 commit comments