Skip to content

Commit ac88081

Browse files
committed
Pass component metadata to pre and post mount events
1 parent 2f3e927 commit ac88081

File tree

5 files changed

+30
-22
lines changed

5 files changed

+30
-22
lines changed

src/LiveComponent/src/EventListener/QueryStringInitializeSubscriber.php

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Symfony\UX\LiveComponent\Metadata\LiveComponentMetadata;
1717
use Symfony\UX\LiveComponent\Metadata\LiveComponentMetadataFactory;
1818
use Symfony\UX\LiveComponent\Util\QueryStringPropsExtractor;
19-
use Symfony\UX\TwigComponent\Event\PreCreateForRenderEvent;
2019
use Symfony\UX\TwigComponent\Event\PreMountEvent;
2120

2221
/**
@@ -43,18 +42,23 @@ public function __construct(
4342
public static function getSubscribedEvents(): array
4443
{
4544
return [
46-
PreCreateForRenderEvent::class => 'onPreCreateForRenderEvent',
4745
PreMountEvent::class => 'onPreMount',
4846
];
4947
}
5048

5149
public function onPreMount(PreMountEvent $event): void
5250
{
53-
$component = $event->getComponent();
54-
if (!($metadata = $this->registered[$component::class] ?? null)) {
51+
$metadata = new LiveComponentMetadata(
52+
$event->getMetadata(),
53+
$this->metadataFactory->createPropMetadatas(new \ReflectionClass($event->getComponent()::class))
54+
);
55+
56+
if (!$metadata->hasQueryStringBindings()) {
5557
return;
5658
}
5759

60+
$component = $event->getComponent();
61+
5862
$data = $event->getData();
5963

6064
$request = $this->requestStack->getMainRequest();
@@ -63,13 +67,4 @@ public function onPreMount(PreMountEvent $event): void
6367

6468
$event->setData(array_merge($data, $queryStringData));
6569
}
66-
67-
public function onPreCreateForRenderEvent(PreCreateForRenderEvent $event): void
68-
{
69-
$componentName = $event->getName();
70-
$metadata = $this->metadataFactory->getMetadata($componentName);
71-
if ($metadata->hasQueryStringBindings()) {
72-
$this->registered[$metadata->getComponentMetadata()->getClass()] = $metadata;
73-
}
74-
}
7570
}

src/TwigComponent/src/ComponentFactory.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public function create(string $name, array $data = []): MountedComponent
7575
public function mountFromObject(object $component, array $data, ComponentMetadata $componentMetadata): MountedComponent
7676
{
7777
$originalData = $data;
78-
$data = $this->preMount($component, $data);
78+
$data = $this->preMount($component, $data, $componentMetadata);
7979

8080
$this->mount($component, $data);
8181

@@ -88,7 +88,7 @@ public function mountFromObject(object $component, array $data, ComponentMetadat
8888
}
8989
}
9090

91-
$postMount = $this->postMount($component, $data);
91+
$postMount = $this->postMount($component, $data, $componentMetadata);
9292
$data = $postMount['data'];
9393
$extraMetadata = $postMount['extraMetadata'];
9494

@@ -174,9 +174,9 @@ private function getComponent(string $name): object
174174
return $this->components->get($name);
175175
}
176176

177-
private function preMount(object $component, array $data): array
177+
private function preMount(object $component, array $data, ComponentMetadata $componentMetadata): array
178178
{
179-
$event = new PreMountEvent($component, $data);
179+
$event = new PreMountEvent($component, $data, $componentMetadata);
180180
$this->eventDispatcher->dispatch($event);
181181
$data = $event->getData();
182182

@@ -194,9 +194,9 @@ private function preMount(object $component, array $data): array
194194
/**
195195
* @return array{data: array<string, mixed>, extraMetadata: array<string, mixed>}
196196
*/
197-
private function postMount(object $component, array $data): array
197+
private function postMount(object $component, array $data, ComponentMetadata $componentMetadata): array
198198
{
199-
$event = new PostMountEvent($component, $data);
199+
$event = new PostMountEvent($component, $data, $componentMetadata);
200200
$this->eventDispatcher->dispatch($event);
201201
$data = $event->getData();
202202
$extraMetadata = $event->getExtraMetadata();

src/TwigComponent/src/Event/PostMountEvent.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\UX\TwigComponent\Event;
1313

1414
use Symfony\Contracts\EventDispatcher\Event;
15+
use Symfony\UX\TwigComponent\ComponentMetadata;
1516

1617
/**
1718
* @author Ryan Weaver <[email protected]>
@@ -21,6 +22,7 @@ final class PostMountEvent extends Event
2122
public function __construct(
2223
private object $component,
2324
private array $data,
25+
private ComponentMetadata $metadata,
2426
private array $extraMetadata = [],
2527
) {
2628
}
@@ -40,6 +42,11 @@ public function setData(array $data): void
4042
$this->data = $data;
4143
}
4244

45+
public function getMetadata(): ComponentMetadata
46+
{
47+
return $this->metadata;
48+
}
49+
4350
public function getExtraMetadata(): array
4451
{
4552
return $this->extraMetadata;

src/TwigComponent/src/Event/PreMountEvent.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
namespace Symfony\UX\TwigComponent\Event;
1313

1414
use Symfony\Contracts\EventDispatcher\Event;
15+
use Symfony\UX\TwigComponent\ComponentMetadata;
1516

1617
/**
1718
* @author Ryan Weaver <[email protected]>
1819
*/
1920
final class PreMountEvent extends Event
2021
{
21-
public function __construct(private object $component, private array $data)
22+
public function __construct(private object $component, private array $data, private ComponentMetadata $metadata)
2223
{
2324
}
2425

@@ -36,4 +37,9 @@ public function setData(array $data): void
3637
{
3738
$this->data = $data;
3839
}
40+
41+
public function getMetadata(): ComponentMetadata
42+
{
43+
return $this->metadata;
44+
}
3945
}

src/TwigComponent/tests/Unit/EventListener/TwigComponentLoggerListenerTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ public function testLoggerStoreEvents(): void
3838
$eventB = new PreCreateForRenderEvent('b');
3939
$logger->onPreCreateForRender($eventB);
4040

41-
$eventC = new PreMountEvent(new \stdClass(), []);
41+
$eventC = new PreMountEvent(new \stdClass(), [], new ComponentMetadata([]));
4242
$logger->onPreMount($eventC);
43-
$eventD = new PostMountEvent(new \stdClass(), []);
43+
$eventD = new PostMountEvent(new \stdClass(), [], new ComponentMetadata([]));
4444
$logger->onPostMount($eventD);
4545

4646
$mounted = new MountedComponent('foo', new \stdClass(), new ComponentAttributes([]));

0 commit comments

Comments
 (0)