Skip to content

Commit 79a5e23

Browse files
authored
Fix component alias resolution for Livewire 4 (#146)
* update component resolution * Fix code styling * support both 3.x and 4.x * add import * Fix code styling * apply similar fix to test utility --------- Co-authored-by: calebporzio <3670578+calebporzio@users.noreply.github.com>
1 parent b48da42 commit 79a5e23

File tree

2 files changed

+38
-14
lines changed

2 files changed

+38
-14
lines changed

src/Component.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,16 @@ public function voltComponentName(): string
8282
*/
8383
public function getAlias(): string
8484
{
85-
return $this->__alias ??= array_search(static::class, (fn () => $this->aliases)->call(
86-
app(ComponentRegistry::class),
85+
// Livewire 3.x alias registry...
86+
if (app()->has(ComponentRegistry::class)) {
87+
return $this->__alias ??= array_search(static::class, (fn () => $this->aliases)->call(
88+
app(ComponentRegistry::class),
89+
));
90+
}
91+
92+
// Livewire 4.x alias registry...
93+
return $this->__alias ??= array_search(static::class, (fn () => $this->resolvedComponentCache)->call(
94+
app('livewire.factory'),
8795
));
8896
}
8997

tests/Feature/FunctionalComponentTest.php

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,22 @@
2525
Volt::mount([__DIR__.'/resources/views/functional-api-pages', __DIR__.'/resources/views/functional-api'], [GlobalTrait::class]);
2626
});
2727

28+
/**
29+
* Reset the resolved component names cache to simulate a new request.
30+
*/
31+
function resetResolvedComponentNames(): void
32+
{
33+
// Livewire 3.x alias registry...
34+
if (app()->has(ComponentRegistry::class)) {
35+
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
36+
37+
return;
38+
}
39+
40+
// Livewire 4.x alias registry...
41+
(fn () => $this->resolvedComponentCache = [])->call(app('livewire.factory'));
42+
}
43+
2844
it('can be rendered', function () {
2945
Livewire::test('basic-component')
3046
->assertSee('Hello World');
@@ -419,7 +435,7 @@ public function render()
419435
$componentA->assertSee('Hello Taylor');
420436
$componentAClass = get_class($componentA->instance());
421437

422-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
438+
resetResolvedComponentNames();
423439

424440
$componentB = Livewire::test('basic-component', ['name' => 'Nuno']);
425441
$componentB->assertSee('Hello Nuno');
@@ -443,7 +459,7 @@ public function render()
443459
$componentA->assertSee('Hello Taylor');
444460
$componentAClass = get_class($componentA->instance());
445461

446-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
462+
resetResolvedComponentNames();
447463

448464
// Clear the views cache...
449465
Artisan::call('view:clear');
@@ -471,7 +487,7 @@ public function render()
471487
$componentA->assertSee('Hello Taylor');
472488
$componentAClass = get_class($componentA->instance());
473489

474-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
490+
resetResolvedComponentNames();
475491

476492
touch($original); // Simulate a change to the component file...
477493
clearstatcache();
@@ -674,16 +690,16 @@ public function render()
674690
Volt::test('first-fragment-component', ['name' => 'Taylor'])
675691
->assertSee('First - Hello Taylor');
676692

677-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
693+
resetResolvedComponentNames();
678694

679695
Volt::test('first-fragment-component', ['name' => 'Taylor'])
680696
->assertSee('First - Hello Taylor');
681697

682-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
698+
resetResolvedComponentNames();
683699

684700
view()->file(__DIR__.'/resources/views/functional-api-pages/page-with-multiple-fragments.blade.php')->render();
685701

686-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
702+
resetResolvedComponentNames();
687703

688704
view()->file(__DIR__.'/resources/views/functional-api-pages/page-with-multiple-fragments.blade.php')->render();
689705

@@ -710,22 +726,22 @@ public function render()
710726
Volt::test('first-fragment-component', ['name' => 'Taylor'])
711727
->assertSee('First - Hello Taylor');
712728

713-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
729+
resetResolvedComponentNames();
714730

715731
Volt::test('first-fragment-component', ['name' => 'Taylor'])
716732
->assertSee('First - Hello Taylor');
717733

718-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
734+
resetResolvedComponentNames();
719735

720736
Volt::test('first-fragment-component', ['name' => 'Taylor'])
721737
->assertSee('First - Hello Taylor');
722738

723-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
739+
resetResolvedComponentNames();
724740

725741
Volt::test('first-fragment-component', ['name' => 'Taylor'])
726742
->assertSee('First - Hello Taylor');
727743

728-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
744+
resetResolvedComponentNames();
729745

730746
Volt::test('first-fragment-component', ['name' => 'Taylor'])
731747
->assertSee('First - Hello Taylor');
@@ -749,7 +765,7 @@ public function render()
749765

750766
File::partialMock();
751767

752-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
768+
resetResolvedComponentNames();
753769
Artisan::call('view:clear');
754770

755771
Volt::test('first-fragment-component', ['name' => 'Taylor'])
@@ -765,7 +781,7 @@ public function render()
765781
]);
766782
});
767783

768-
(fn () => $this->aliases = [])->call(app(ComponentRegistry::class));
784+
resetResolvedComponentNames();
769785
Artisan::call('view:clear');
770786

771787
Volt::test('first-fragment-component', ['name' => 'Taylor'])

0 commit comments

Comments
 (0)