Атрибут Rule
Атрибут Rule в Livewire используется для декларативного задания правил валидации свойств компонента. Он позволяет определить правила проверки данных прямо в классе компонента, используя синтаксис PHP-атрибутов. Это альтернатива методу rules, которая делает код более читаемым и удобным для поддержки.
Синтаксис
<?php
use Livewire\Attributes\Rule;
use Livewire\Component;
class Example extends Component
{
#[Rule('required|email')]
public $email;
}
?>
Атрибут Rule принимает строку с правилами валидации, аналогичными тем, что используются в Laravel. Можно передавать как одиночное правило, так и несколько правил, разделённых вертикальной чертой |.
Пример
Давайте создадим компонент с полем ввода email и применим атрибут Rule:
<?php
namespace App\Livewire;
use Livewire\Attributes\Rule;
use Livewire\Component;
class UserForm extends Component
{
#[Rule('required|email')]
public $email = '';
public function save()
{
$this->validate();
// Сохранение данных
}
public function render()
{
return view('livewire.user-form');
}
}
?>
<div>
<input type="text" wire:model="email">
@error('email')
<span>{{ $message }}</span>
@enderror
<button wire:click="save">Save</button>
</div>
Пример
Атрибут Rule поддерживает все правила валидации Laravel. Рассмотрим пример со сложной валидацией:
<?php
namespace App\Livewire;
use Livewire\Attributes\Rule;
use Livewire\Component;
class ArticleForm extends Component
{
#[Rule('required|string|min:5|max:100')]
public $title = '';
#[Rule('required|string|min:20')]
public $content = '';
#[Rule('required|in:draft,published')]
public $status = 'draft';
public function publish()
{
$this->validate();
// Публикация статьи
}
public function render()
{
return view('livewire.article-form');
}
}
?>
<div>
<div>
<label>Title:</label>
<input type="text" wire:model="title">
@error('title')
<span>{{ $message }}</span>
@enderror
</div>
<div>
<label>Content:</label>
<textarea wire:model="content"></textarea>
@error('content')
<span>{{ $message }}</span>
@enderror
</div>
<div>
<label>Status:</label>
<select wire:model="status">
<option value="draft">Draft</option>
<option value="published">Published</option>
</select>
@error('status')
<span>{{ $message }}</span>
@enderror
</div>
<button wire:click="publish">Publish</button>
</div>