Livewire — реактивные и динамические интерфейсы на Laravel
документация: https://laravel-livewire.com/docs/2.x/quickstart
установка
composer require livewire/livewire
или
php -d memory_limit=-1 $(which composer) require livewire/livewire
подгрузка js и css в blade шаблонах
...
@livewireStyles
</head>
<body>
...
@livewireScripts
</body>
</html>
создание компонета Livewire
php artisan make:livewire ListComponent
после выполнения данной команды будут созданы: app/Http/Livewire/ListComponent.php и resources/views/livewire/list-component.blade.php
Пример вывода списка в виде таблицы
создать компонент:
php artisan make:livewire TableListComponent
открыть файл resources/views/livewire/table-list-component.blade.php и заполнить (таблица с запросом на сортировку по одному из столбиков):
<div>
<div class="row">
<div class="col-12">
<table class="table">
<thead>
<tr>
<th>
<label>
<input type="radio" name="sort" wire:model="sort" value="col1" />
Столбец 1
</label>
</th>
<th>
<label>
<input type="radio" name="sort" wire:model="sort" value="col2" />
Столбец 2
</label>
</th>
<th>
<label>
<input type="radio" name="sort" wire:model="sort" value="col3" />
Столбец 3
</label>
</th>
</tr>
</thead>
<tbody>
@if (count($list))
@foreach($list as $row)
<tr>
<td>{{$row->col1}}</td>
<td>{{$row->col2}}</td>
<td>{{$row->col3}}</td>
</tr>
@endforeach
@else
<tr>
<td colspan="3">Список пуст</td>
</tr>
@endif
</tbody>
</table>
</div>
</div>
</div>
открыть файл app/Http/Livewire/TableListComponent.php и заполнить:
<?php
namespace App\Http\Livewire;
use Livewire\Component;
use App\Models\Table;
class TableListComponent extends Component
{
public $sort = 'col1', $list;
public function render()
{
$this->list = Table::orderBy($this->sort, 'asc')->get();
return view('livewire.table-list-component');
}
}
создать обертку (для использования команды нужен пакет theanik/laravel-more-command):
php artisan make:view wrapper
открыть файл resources/views/wrapper.blade.php и заполнить:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="/assets/images/favicon.png" type="image/png" sizes="32x32 64x64"/>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
<link rel="icon" href="/favicon.ico" type="image/x-icon"/>
<title>{{ env('APP_NAME') }}</title>
<!-- Fonts -->
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,300italic,400italic,600,600italic,700italic,700,800,800italic&subset=latin,cyrillic,latin-ext,cyrillic-ext,vietnamese,greek-ext,greek' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
@livewireStyles
<link href="/css/app.css" rel="stylesheet">
</head>
<body>
<div class="wrapper">
@yield('content')
</div>
<!-- JavaScripts -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
@livewireScripts
</body>
</html>
создать шаблон для страницы на которую выводить таблицу:
php artisan make:view pageList
открыть шаблон resources/views/pageList.blade.php и заполнить:
@extends('wrapper')
@section('content')
@livewire('table-list-component')
@endsection
открыть routes/web.php и добавить route:
<?php
// ...
Route::view('list', 'pageList')
->name('pageList');