News

Livewire Volt Has A New Class-based API

Published
Livewire Volt Has A New Class-based API image

The Laravel team recently released Volt, which allows you to build full Livewire components right in your Blade views. Initially, it was released with a functional syntax. You can import Volt's functions and wrap your Livewire functionality for state, computed properties, actions, etc. in those.

For example, a simple component for creating a post using the functional syntax:

<?php
 
use App\Models\Post;
use function Livewire\Volt\{state};
use function Livewire\Volt\{rules};
 
state([
'title' => '',
'content' => '',
]);
 
rules([
'title' => ['required', 'max:250'],
'content' => ['required', 'max:10000'],
]);
 
$save = function () {
$this->validate();
 
Post::create([
'title' => $this->title,
'content' => $this->content,
]);
 
return redirect('/posts');
}
?>
 
<form wire:submit="save">
<div>
<label>Title</label>
<input wire:model="title" type="text" />
</div>
<div>
<label>Content</label>
<textarea wire:model="content"></textarea>
</div>
 
<button>Save</button>
</form>

As of today, the Laravel team has released v1.0-beta.3 which introduces a new class-based syntax for Volt components. This allows you to write Livewire components using the more traditional syntax you're used to, but still all inside your Blade files.

For example, the same create post component written with the new class-based syntax:

<?php
 
use App\Models\Post;
use Livewire\Volt\Component;
use Livewire\Attributes\Rule;
 
new class extends Component
{
#[Rule(['required', 'max:250'])]
public $title = '';
 
#[Rule(['required', 'max:10000'])]
public $content = '';
 
public function save() {
$this->validate();
 
Post::create([
'title' => $this->title,
'content' => $this->content,
]);
 
return redirect('/posts');
}
}
?>
 
<form wire:submit="save">
<div>
<label>Title</label>
<input wire:model="title" type="text" />
</div>
<div>
<label>Content</label>
<textarea wire:model="content"></textarea>
</div>
 
<button>Save</button>
</form>

What do you think? Do you prefer the functional syntax or the more traditional class-based syntax? Personally, I like the class-based syntax a little more, but it's awesome to see the Laravel team providing multiple ways for people to build functionality!

Jason Beggs photo

TALL stack (Tailwind CSS, Alpine.js, Laravel, and Livewire) consultant and owner of designtotailwind.com.

Filed in

Sponsored

masteringlaravel logo
Laravel Code Review

Get expert guidance in a few days with a Laravel code review

Visit Laravel Code Review

The latest

View all →
What We Know About Laravel 14 image

What We Know About Laravel 14

Read article
Difflock: Lint Laravel Migrations and Diff Your Schema image

Difflock: Lint Laravel Migrations and Diff Your Schema

Read article
Fresh Package: Laravel Package Skeleton with Testbench, CI, and Boost Integration image

Fresh Package: Laravel Package Skeleton with Testbench, CI, and Boost Integration

Read article
Inertia DevTools Now Available for Firefox image

Inertia DevTools Now Available for Firefox

Read article
Laravel Scalpel Scans for Filesystem Intrusion Evidence image

Laravel Scalpel Scans for Filesystem Intrusion Evidence

Read article
Mercure Broadcasting in Laravel 13.32 image

Mercure Broadcasting in Laravel 13.32

Read article