Skip to content

Commit b07adff

Browse files
committed
QueryStringPropsExtractor, renamed to RequestPropsExtractor shall get props also from path. RequestInitializeSubscriber also renamed
1 parent f4233de commit b07adff

File tree

5 files changed

+23
-19
lines changed

5 files changed

+23
-19
lines changed

src/LiveComponent/src/DependencyInjection/LiveComponentExtension.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
use Symfony\UX\LiveComponent\EventListener\InterceptChildComponentRenderSubscriber;
3535
use Symfony\UX\LiveComponent\EventListener\LiveComponentSubscriber;
3636
use Symfony\UX\LiveComponent\EventListener\LiveUrlSubscriber;
37-
use Symfony\UX\LiveComponent\EventListener\QueryStringInitializeSubscriber;
37+
use Symfony\UX\LiveComponent\EventListener\RequestInitializeSubscriber;
3838
use Symfony\UX\LiveComponent\EventListener\ResetDeterministicIdSubscriber;
3939
use Symfony\UX\LiveComponent\Form\Type\LiveCollectionType;
4040
use Symfony\UX\LiveComponent\Hydration\HydrationExtensionInterface;
@@ -51,7 +51,7 @@
5151
use Symfony\UX\LiveComponent\Util\FingerprintCalculator;
5252
use Symfony\UX\LiveComponent\Util\LiveComponentStack;
5353
use Symfony\UX\LiveComponent\Util\LiveControllerAttributesCreator;
54-
use Symfony\UX\LiveComponent\Util\QueryStringPropsExtractor;
54+
use Symfony\UX\LiveComponent\Util\RequestPropsExtractor;
5555
use Symfony\UX\LiveComponent\Util\TwigAttributeHelperFactory;
5656
use Symfony\UX\TwigComponent\ComponentFactory;
5757
use Symfony\UX\TwigComponent\ComponentRenderer;
@@ -138,8 +138,8 @@ function (ChildDefinition $definition, AsLiveComponent $attribute) {
138138

139139
$container->register('ux.live_component.live_url_subscriber', LiveUrlSubscriber::class)
140140
->setArguments([
141-
new Reference('router'),
142141
new Reference('ux.live_component.metadata_factory'),
142+
new Reference('ux.live_component.url_factory'),
143143
])
144144
->addTag('kernel.event_subscriber')
145145
;
@@ -209,6 +209,9 @@ function (ChildDefinition $definition, AsLiveComponent $attribute) {
209209
$container->register('ux.live_component.attribute_helper_factory', TwigAttributeHelperFactory::class)
210210
->setArguments([new Reference('twig')]);
211211

212+
$container->register('ux.live_component.url_factory', UrlFactory::class)
213+
->setArguments([new Reference('router')]);
214+
212215
$container->register('ux.live_component.live_controller_attributes_creator', LiveControllerAttributesCreator::class)
213216
->setArguments([
214217
new Reference('ux.live_component.metadata_factory'),
@@ -231,12 +234,12 @@ function (ChildDefinition $definition, AsLiveComponent $attribute) {
231234
->addTag('container.service_subscriber', ['key' => LiveControllerAttributesCreator::class, 'id' => 'ux.live_component.live_controller_attributes_creator'])
232235
;
233236

234-
$container->register('ux.live_component.query_string_props_extractor', QueryStringPropsExtractor::class)
237+
$container->register('ux.live_component.query_string_props_extractor', RequestPropsExtractor::class)
235238
->setArguments([
236239
new Reference('ux.live_component.component_hydrator'),
237240
]);
238241

239-
$container->register('ux.live_component.query_string_initializer_subscriber', QueryStringInitializeSubscriber::class)
242+
$container->register('ux.live_component.query_string_initializer_subscriber', RequestInitializeSubscriber::class)
240243
->setArguments([
241244
new Reference('request_stack'),
242245
new Reference('ux.live_component.metadata_factory'),

src/LiveComponent/src/EventListener/QueryStringInitializeSubscriber.php renamed to src/LiveComponent/src/EventListener/RequestInitializeSubscriber.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,20 @@
1616
use Symfony\Component\PropertyAccess\Exception\ExceptionInterface as PropertyAccessExceptionInterface;
1717
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
1818
use Symfony\UX\LiveComponent\Metadata\LiveComponentMetadataFactory;
19-
use Symfony\UX\LiveComponent\Util\QueryStringPropsExtractor;
19+
use Symfony\UX\LiveComponent\Util\RequestPropsExtractor;
2020
use Symfony\UX\TwigComponent\Event\PostMountEvent;
2121

2222
/**
2323
* @author Nicolas Rigaud <[email protected]>
2424
*
2525
* @internal
2626
*/
27-
class QueryStringInitializeSubscriber implements EventSubscriberInterface
27+
class RequestInitializeSubscriber implements EventSubscriberInterface
2828
{
2929
public function __construct(
3030
private readonly RequestStack $requestStack,
3131
private readonly LiveComponentMetadataFactory $metadataFactory,
32-
private readonly QueryStringPropsExtractor $queryStringPropsExtractor,
32+
private readonly RequestPropsExtractor $requestPropsExtractor,
3333
private readonly PropertyAccessorInterface $propertyAccessor,
3434
) {
3535
}
@@ -60,11 +60,11 @@ public function onPostMount(PostMountEvent $event): void
6060
return;
6161
}
6262

63-
$queryStringData = $this->queryStringPropsExtractor->extract($request, $metadata, $event->getComponent());
63+
$requestData = $this->requestPropsExtractor->extract($request, $metadata, $event->getComponent());
6464

6565
$component = $event->getComponent();
6666

67-
foreach ($queryStringData as $name => $value) {
67+
foreach ($requestData as $name => $value) {
6868
try {
6969
$this->propertyAccessor->setValue($component, $name, $value);
7070
} catch (PropertyAccessExceptionInterface $exception) {

src/LiveComponent/src/Util/QueryStringPropsExtractor.php renamed to src/LiveComponent/src/Util/RequestPropsExtractor.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,29 @@
2222
*
2323
* @internal
2424
*/
25-
final class QueryStringPropsExtractor
25+
final class RequestPropsExtractor
2626
{
2727
public function __construct(private readonly LiveComponentHydrator $hydrator)
2828
{
2929
}
3030

3131
/**
32-
* Extracts relevant query parameters from the current URL and hydrates them.
32+
* Extracts relevant props parameters from the current URL and hydrates them.
3333
*/
3434
public function extract(Request $request, LiveComponentMetadata $metadata, object $component): array
3535
{
36-
$query = $request->query->all();
36+
$parameters = array_merge($request->attributes->all(), $request->query->all());
3737

38-
if (empty($query)) {
38+
// @todo never empty because custom values prefixed with _ ... do something ?
39+
if (empty($parameters)) {
3940
return [];
4041
}
4142
$data = [];
4243

4344
foreach ($metadata->getAllLivePropsMetadata($component) as $livePropMetadata) {
4445
if ($queryMapping = $livePropMetadata->urlMapping()) {
4546
$frontendName = $livePropMetadata->calculateFieldName($component, $livePropMetadata->getName());
46-
if (null !== ($value = $query[$queryMapping->as ?? $frontendName] ?? null)) {
47+
if (null !== ($value = $parameters[$queryMapping->as ?? $frontendName] ?? null)) {
4748
if ('' === $value && null !== $livePropMetadata->getType() && (!$livePropMetadata->isBuiltIn() || 'array' === $livePropMetadata->getType())) {
4849
// Cast empty string to empty array for objects and arrays
4950
$value = [];
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
1515
use Zenstruck\Browser\Test\HasBrowser;
1616

17-
class QueryStringInitializerSubscriberTest extends KernelTestCase
17+
class RequestInitializerSubscriberTest extends KernelTestCase
1818
{
1919
use HasBrowser;
2020

src/LiveComponent/tests/Functional/Util/QueryStringPropsExtractorTest.php renamed to src/LiveComponent/tests/Functional/Util/RequestPropsExtractorTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
use Symfony\UX\LiveComponent\Metadata\LiveComponentMetadataFactory;
1717
use Symfony\UX\LiveComponent\Tests\Fixtures\Dto\Address;
1818
use Symfony\UX\LiveComponent\Tests\LiveComponentTestHelper;
19-
use Symfony\UX\LiveComponent\Util\QueryStringPropsExtractor;
19+
use Symfony\UX\LiveComponent\Util\RequestPropsExtractor;
2020

21-
class QueryStringPropsExtractorTest extends KernelTestCase
21+
class RequestPropsExtractorTest extends KernelTestCase
2222
{
2323
use LiveComponentTestHelper;
2424

@@ -27,7 +27,7 @@ class QueryStringPropsExtractorTest extends KernelTestCase
2727
*/
2828
public function testExtract(string $queryString, array $expected)
2929
{
30-
$extractor = new QueryStringPropsExtractor($this->hydrator());
30+
$extractor = new RequestPropsExtractor($this->hydrator());
3131

3232
$request = Request::create('/'.!empty($queryString) ? '?'.$queryString : '');
3333

0 commit comments

Comments
 (0)