Skip to content

Commit

Permalink
allow page composition through Route::livewire
Browse files Browse the repository at this point in the history
  • Loading branch information
faustbrian committed Aug 12, 2019
1 parent 0ecabb0 commit 4554501
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 10 deletions.
23 changes: 14 additions & 9 deletions src/Macros/RouterMacros.php
Expand Up @@ -2,6 +2,8 @@

namespace Livewire\Macros;

use Illuminate\Support\Arr;

class RouterMacros
{
public function layout()
Expand All @@ -24,18 +26,21 @@ public function section()

public function livewire()
{
return function ($uri, $component) {
return $this->get($uri, function () use ($component) {
$componentClass = app('livewire')->getComponentClass($component);
$reflected = new \ReflectionClass($componentClass);

return function ($uri, $components) {
return $this->get($uri, function () use ($components) {
return app('view')->file(__DIR__.'/livewire-view.blade.php', [
'layout' => $this->current()->getAction('layout') ?? 'layouts.app',
'section' => $this->current()->getAction('section') ?? 'content',
'component' => $component,
'componentOptions' => $reflected->hasMethod('mount')
? (new PretendClassMethodIsControllerMethod($reflected->getMethod('mount'), $this))->retrieveBindings()
: [],
'components' => collect(Arr::wrap($components))->mapWithKeys(function ($component) {
$componentClass = app('livewire')->getComponentClass($component);
$reflected = new \ReflectionClass($componentClass);

return [
$component => $reflected->hasMethod('mount')
? (new PretendClassMethodIsControllerMethod($reflected->getMethod('mount'), $this))->retrieveBindings()
: [],
];
}),
]);
});
};
Expand Down
4 changes: 3 additions & 1 deletion src/Macros/livewire-view.blade.php
@@ -1,5 +1,7 @@
@extends($layout)

@section($section)
@livewire($component, ...$componentOptions)
@foreach($components as $component => $componentOptions)
@livewire($component, ...$componentOptions)
@endforeach
@endsection
50 changes: 50 additions & 0 deletions tests/PageCompositionTest.php
@@ -0,0 +1,50 @@
<?php

namespace Tests;

use Livewire\Livewire;
use Livewire\Component;
use Illuminate\Support\Facades\Route;

class PageCompositionTest extends TestCase
{
/** @test */
public function composes_page_with_a_single_component()
{
Livewire::component('foo', ComposableComponent::class);

Route::livewire('/test/{name}', 'foo')->middleware('web');

$this
->get('/test/name-from-route')
->assertSee('wire:name="foo"')
->assertSeeText('name-from-route');
}

/** @test */
public function composes_page_with_multiple_components()
{
Livewire::component('foo', ComposableComponent::class);
Livewire::component('bar', ComposableComponent::class);

Route::livewire('/test/{name}', ['foo', 'bar'])->middleware('web');

$this
->get('/test/name-from-route')
->assertSeeInOrder(['wire:name="foo"', 'wire:name="bar"'])
->assertSeeText('name-from-route');
}
}

class ComposableComponent extends Component
{
public function mount(string $name)
{
$this->name = $name;
}

public function render()
{
return app('view')->make('show-name')->with('name', $this->name);
}
}

0 comments on commit 4554501

Please sign in to comment.