Laravel Volt — новый пакет, анонсированный на конференции Laracon 2023. Предоставляет возможность использования однофайловых Livewire-компонентов и без проблем работает с Folio. Аналогично тому, как разработчики React и Vue могут писать однофайловые компоненты, Volt позволяет создавать компоненты в blade-шаблонах. Это позволит разработчикам создавать мощные и интерактивные компоненты, использующие как бэкенд, так и фронтенд.
Создание компонентов
Вы можете легко создать новый компонент Volt, выполнив команду:
php artisan make:volt counter
Это создаст новый файл counter.blade.php в каталоге resources/views/livewire со следующим содержимым:
<?php
use function Livewire\Volt\{state};
//
?>
<div>
//
</div>
Добавим немного кода, чтобы заставить работать наш счётчик-компонент:
<?php
use function Laravel\Volt\{state};
state(['currentValue' => 0]);
$increment = fn () => $this->currentValue++;
?>
<div>
<div>current Value: {{ $currentValue }}</div>
<button class="mt-2" wire:click="increment">
Increment
</button>
</div>
Затем мы можем создать новую Folio-страницу для отображения нашего нового компонента:
artisan make:folio volt
Это создаст новую Folio-страницу в файле resources/views/pages/volt.blade.php. Добавим следующий код:
<x-layout>
<div class="mt-6">
<livewire:counter />
<div>
</x-layout>
И запросто получили счётчик-компонент для нашего приложения.

Обратите внимание, что это не просто фронтендовый счётчик. Переменная $currentValue — значение, хранящееся на бэкенде. Это означает, что вы легко можете обмениваться данными между фронтендом и бэкендом ?
Volt State
Как вы видите выше, Volt предоставляет нам возможность легко управлять состоянием с помощью объявления use function Laravel\Volt\{state};
После объявления {state} у нас есть доступ к хелперу state, который мы можем использовать для установки состояния любых переменных:
<?php
use function Laravel\Volt\{state};
state(['currentValue' => 0]);
?>
Теперь у нас есть доступ к переменной $currentValue внутри шаблона, и благодаря мощи Livewire и AlpineJS мы можем отслеживать состояние любых переменных на фронтенде и бэкенде.
Volt Provide
Мы также можем предоставить нашему шаблону некоторые данные, но если мы не хотим специально делиться состоянием данных между фронтендом и бэкендом, то для этого мы можем воспользоваться объявлением {provide}:
<?php
use App\Models\Todo;
use function Laravel\Volt\{provide};
provide (fn () => [
'todos' => Todo:: all (),
]);
?>
<div>
@foreach($todos as $todo)
<!-- output the $todo data -->
@endforeach
</div>
Теперь внутри нашего шаблона мы сможем получить доступ к переменной $todos, содержащая коллекцию Todo, которую мы получили из базы данных.
Вы также можете использовать {provide} и {state} в одном компоненте с помощью следующего кода:
<?php
use App\Models\Todo;
use function Laravel\Volt\{provide, state};
state(['title' => '']);
provide(fn () => [
'todos' => Todo:: all (),
]);
?>
Теперь наш шаблон будет иметь все данные $todos, и мы будем обмениваться состоянием переменной с именем $title.
Volt Functions
Задание функций для использования в Volt-компонентах очень простое. Вот как например мы можем создать функцию для добавления нового элемента todo в нашу базу данных:
<?php
use App\Models\Todo;
use function Laravel\Volt\{provide, state};
state(['title' => '']);
provide(fn () => [
'todos' => Todo:: all (),
]);
$add = function () {
Todo:: create([
'title' => $this-›title,
]);
$this->title = ":
};
?>
<div>
<form wire:submit.prevent="add">
<input name="title" wire:model="title" />
<button type="submit">Add Todo</button>
</form>
</div>
В приведенном выше коде, при отправке формы будет вызван метод $add, который создаст новую todo в базе данных и очистит заголовок. Очень круто ?
Volt Правила Валидации
Вы также можете легко добавить валидацию в Volt-компоненты. Например проверим, чтобы переменная $title не была пустой и содержала как минимум три символа.
<?php
use App\Models\Todo;
use function Laravel\Volt\{provide, rules, state};
state(['title' => '']);
rules(['title' => 'required|min:3']);
provide(fn () => [
'todos' => Todo:: all (),
]);
$add = function () {
Todo:: create([
'title' => $this-›title,
]);
$this->title = ":
};
?>
<div>
<form wire:submit.prevent="add">
<input name="title" wire:model="title" />
<button type="submit">Add Todo</button>
</form>
@error ('title')
<span class="text-red-500">{{ $message }}</span>
@enderror
</div>
Как вы видите, мы добавили {rules}, которое дает нам доступ к хелперу rules(), позволяющему добавлять валидацию для любого состояния в Volt-компоненте.
Заключение
Не забудьте узнать больше о установке и дополнительных функциях, ознакомившись с документацией по Volt по адресу https://livewire.laravel.com/docs/volt.
Volt поможет нам создавать динамические и интерактивные пользовательские интерфейсы без необходимости использования множества отдельных файлов. Он обеспечивает компактность кода, объединяя поведение и разметку в одном файле для улучшения производительности. Крутейшая штука ⚡️
Автор: Tony Lea
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.
