3.4. Валидация

3.4. Валидация

Livewire стремится сделать процесс валидации пользовательского ввода и предоставления обратной связи максимально удобным. Используя встроенные возможности валидации Laravel, Livewire опирается на уже имеющиеся у вас знания и при этом предоставляет надёжные дополнительные функции, такие как валидация в реальном времени.

Вот пример компонента CreatePost, демонстрирующего самый базовый процесс валидации в Livewire:

<?php
 
namespace App\Livewire;
 
use Livewire\Component;
use App\Models\Post;
 
class CreatePost extends Component
{
public $title = '';
 
public $content = '';
 
public function save()
{
$validated = $this->validate([
'title' => 'required|min:3',
'content' => 'required|min:3',
]);
 
Post::create($validated);
 
return redirect()->to('/posts');
}
 
public function render()
{
return view('livewire.create-post');
}
}
<form wire:submit="save">
<input type="text" wire:model="title">
<div>@error('title') {{ $message }} @enderror</div>
 
<textarea wire:model="content"></textarea>
<div>@error('content') {{ $message }} @enderror</div>
 
<button type="submit">Save</button>
</form>

Как видите, Livewire предоставляет метод validate(), который можно вызвать для валидации свойств компонента. Он возвращает проверенный набор данных, который затем можно безопасно сохранить в базе данных.

На фронтенде вы можете использовать существующие Blade-директивы Laravel для отображения сообщений валидации пользователям.

Для получения дополнительной информации см. документацию Laravel по отображению ошибок валидации в Blade.

1. Валидация атрибутов

Если вы предпочитаете располагать правила валидации компонента непосредственно рядом со свойствами, вы можете использовать атрибут Livewire #[Validate].

При привязке правил валидации к свойствам с помощью #[Validate], Livewire будет автоматически выполнять валидацию этих свойств перед каждым их обновлением. Тем не менее, вы всё равно должны вызывать $this->validate() перед сохранением данных в базу, чтобы проверить свойства, которые не были изменены.

use Livewire\Attributes\Validate;
use Livewire\Component;
use App\Models\Post;
 
class CreatePost extends Component
{
#[Validate('required|min:3')]
public $title = '';
 
#[Validate('required|min:3')]
public $content = '';
 
public function save()
{
$this->validate();
 
Post::create([
'title' => $this->title,
'content' => $this->content,
]);
 
return redirect()->to('/posts');
}
 
// ...
}