Livewire — это полностековый фреймворк для создания динамических интерфейсов в Laravel, который позволяет писать реактивные компоненты на чистом PHP, без необходимости в сложных JavaScript-фреймворках.
Ключевые особенности:
Установка через Composer:
composer require livewire/livewire
Добавление в шаблон (app.blade.php
):
@livewireStyles
@livewireScripts
Генерация компонента:
php artisan make:livewire Counter
Структура компонента:
app/Http/Livewire/Counter.php
(логика)resources/views/livewire/counter.blade.php
(шаблон)Класс компонента:
namespace App\Http\Livewire;
use Livewire\Component;
class Counter extends Component
{
public $count = 0;
public function increment()
{
$this->count++;
}
public function render()
{
return view('livewire.counter');
}
}
Шаблон компонента:
<div>
<button wire:click="increment">+</button>
<span>{{ $count }}</span>
</div>
Использование в blade-шаблоне:
<livewire:counter />
wire:click
- обработчик кликаwire:submit
- отправка формыwire:model
- двустороннее связывание данныхwire:if
/ wire:else
wire:for
- циклы<input wire:model.debounce.500ms="search" type="text">
mount()
render()
hydrate()
, hydrateX
, dehydrate()
Пример хуков жизненного цикла:
public function mount()
{
$this->count = 5; // Инициализация
}
public function hydrate()
{
// Вызывается перед каждым обновлением
}
Пример формы с валидацией:
class ContactForm extends Component
{
public $name;
public $email;
protected $rules = [
'name' => 'required|min:3',
'email' => 'required|email',
];
public function submit()
{
$this->validate();
Contact::create([
'name' => $this->name,
'email' => $this->email
]);
}
}
Шаблон формы:
<form wire:submit.prevent="submit">
<input wire:model="name" type="text">
@error('name') <span>{{ $message }}</span> @enderror
<input wire:model="email" type="email">
@error('email') <span>{{ $message }}</span> @enderror
<button type="submit">Save</button>
</form>
public $photo;
public function save()
{
$this->validate([
'photo' => 'image|max:1024',
]);
$this->photo->store('photos');
}
// Отправка события
$this->emit('postAdded');
// Подписка на событие
protected $listeners = ['postAdded' => 'refreshPosts'];
public function loadPosts()
{
$this->readyToLoad = true;
}
public function getPostsProperty()
{
if (!$this->readyToLoad) return [];
return Post::all();
}
<livewire:posts lazy />
<input wire:model.debounce.500ms="search" type="text">
public function getResultsProperty()
{
return cache()->remember('posts', 60, function() {
return Post::all();
});
}
Livewire — это:
Ключевые преимущества:
Когда использовать:
Ограничения:
Для production-проектов: