Skip to content

Commit 0acc77c

Browse files
committed
Other small ComponentFactory optimizations
1 parent d4092c2 commit 0acc77c

File tree

1 file changed

+24
-30
lines changed

1 file changed

+24
-30
lines changed

src/TwigComponent/src/ComponentFactory.php

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,19 @@
2525
*/
2626
final 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,22 +87,23 @@ 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();
@@ -120,9 +120,9 @@ public function mountFromObject(object $component, array $data, ComponentMetadat
120120
return new MountedComponent(
121121
$componentMetadata->getName(),
122122
$component,
123-
new ComponentAttributes(array_merge($attributes, $data)),
123+
new ComponentAttributes([...$attributes, ...$data]),
124124
$originalData,
125-
$extraMetadata,
125+
$postMount->getExtraMetadata(),
126126
);
127127
}
128128

@@ -154,7 +154,7 @@ private function mount(object $component, array &$data, ComponentMetadata $compo
154154
return;
155155
}
156156

157-
$mount = self::$mountMethods[$component::class] ??= (new \ReflectionClass($component))->getMethod('mount');
157+
$mount = $this->mountMethods[$component::class] ??= (new \ReflectionClass($component))->getMethod('mount');
158158

159159
$parameters = [];
160160
foreach ($mount->getParameters() as $refParameter) {
@@ -172,40 +172,34 @@ private function mount(object $component, array &$data, ComponentMetadata $compo
172172
$mount->invoke($component, ...$parameters);
173173
}
174174

175-
private function preMount(object $component, array $data, ComponentMetadata $componentMetadata): array
175+
private function preMount(object $component, array $data, ComponentMetadata $componentMetadata): PreMountEvent
176176
{
177177
$event = new PreMountEvent($component, $data, $componentMetadata);
178178
$this->eventDispatcher->dispatch($event);
179-
$data = $event->getData();
180179

180+
$data = $event->getData();
181181
foreach ($componentMetadata->getPreMounts() as $preMount) {
182182
if (null !== $newData = $component->$preMount($data)) {
183-
$data = $newData;
183+
$event->setData($data = $newData);
184184
}
185185
}
186186

187-
return $data;
187+
return $event;
188188
}
189189

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
194191
{
195192
$event = new PostMountEvent($component, $data, $componentMetadata);
196193
$this->eventDispatcher->dispatch($event);
197-
$data = $event->getData();
198194

195+
$data = $event->getData();
199196
foreach ($componentMetadata->getPostMounts() as $postMount) {
200197
if (null !== $newData = $component->$postMount($data)) {
201-
$data = $newData;
198+
$event->setData($data = $newData);
202199
}
203200
}
204201

205-
return [
206-
'data' => $data,
207-
'extraMetadata' => $event->getExtraMetadata(),
208-
];
202+
return $event;
209203
}
210204

211205
/**
@@ -244,6 +238,6 @@ private function throwUnknownComponentException(string $name): void
244238

245239
public function reset(): void
246240
{
247-
self::$mountMethods = [];
241+
$this->mountMethods = [];
248242
}
249243
}

0 commit comments

Comments
 (0)