Класс Form
Класс Form в Livewire предназначен для вынесения логики валидации
и управления данными формы в отдельный класс. Это позволяет
организовать код компонента, сделав его более чистым
и переиспользуемым. Класс Form содержит свойства, которые
соответствуют полям формы, и методы для валидации и заполнения данных.
Для создания класса Form используется команда php artisan livewire:form,
которая генерирует класс в директории app/Livewire/Forms.
Класс должен наследоваться от Livewire\Form и может использовать
атрибуты #[Rule] для определения правил валидации.
Основное преимущество - вся логика формы находится в одном месте,
а компонент только использует готовый объект формы.
Создание класса Form
Давайте создадим класс Form для формы регистрации пользователя:
<?php
namespace App\Livewire\Forms;
use Livewire\Form;
use Livewire\Attributes\Rule;
class RegistrationForm extends Form
{
#[Rule('required|min:3|max:50')]
public $name = '';
#[Rule('required|email|max:100')]
public $email = '';
#[Rule('required|min:8|confirmed')]
public $password = '';
#[Rule('required')]
public $password_confirmation = '';
}
?>
В этом примере мы определили свойства формы и правила валидации
для каждого поля с помощью атрибутов #[Rule].
Использование Form в компоненте
Теперь создадим компонент, который будет использовать созданный класс Form:
<?php
namespace App\Livewire;
use Livewire\Component;
use App\Livewire\Forms\RegistrationForm;
class Registration extends Component
{
public RegistrationForm $form;
public function save()
{
$this->form->validate();
// Save user logic here
session()->flash('message', 'Registration successful!');
}
public function render()
{
return view('livewire.registration');
}
}
?>
<form wire:submit="save">
<div>
<label for="name">Name</label>
<input type="text" id="name" wire:model="form.name">
@error('form.name') <span>{{ $message }}</span> @enderror
</div>
<div>
<label for="email">Email</label>
<input type="email" id="email" wire:model="form.email">
@error('form.email') <span>{{ $message }}</span> @enderror
</div>
<div>
<label for="password">Password</label>
<input type="password" id="password" wire:model="form.password">
@error('form.password') <span>{{ $message }}</span> @enderror
</div>
<div>
<label for="password_confirmation">Confirm Password</label>
<input type="password" id="password_confirmation" wire:model="form.password_confirmation">
@error('form.password_confirmation') <span>{{ $message }}</span> @enderror
</div>
<button type="submit">Register</button>
</form>
Результат выполнения кода:
<form>
<div>
<label>Name</label>
<input type="text" value="John Doe">
</div>
<div>
<label>Email</label>
<input type="email" value="john@example.com">
</div>
<div>
<label>Password</label>
<input type="password">
</div>
<div>
<label>Confirm Password</label>
<input type="password">
</div>
<button>Register</button>
</form>
Метод validate
Метод validate выполняет валидацию всех свойств формы
на основе заданных правил. В случае ошибки валидации
выбрасывается исключение, и ошибки отображаются в шаблоне:
<?php
namespace App\Livewire\Forms;
use Livewire\Form;
use Livewire\Attributes\Rule;
class LoginForm extends Form
{
#[Rule('required|email')]
public $email = '';
#[Rule('required|min:6')]
public $password = '';
public function login()
{
$this->validate();
// Attempt login
}
}
?>
Метод validateOnly
Метод validateOnly выполняет валидацию только одного поля формы.
Это полезно для валидации в реальном времени при вводе данных:
<?php
namespace App\Livewire\Forms;
use Livewire\Form;
use Livewire\Attributes\Rule;
class ProfileForm extends Form
{
#[Rule('required|min:2|max:30')]
public $username = '';
#[Rule('required|email|unique:users,email')]
public $email = '';
public function updated($field)
{
$this->validateOnly($field);
}
}
?>
Метод reset
Метод reset сбрасывает все свойства формы к их начальным значениям.
Это полезно после успешной отправки формы:
<?php
namespace App\Livewire\Forms;
use Livewire\Form;
use Livewire\Attributes\Rule;
class ContactForm extends Form
{
#[Rule('required|min:3')]
public $name = '';
#[Rule('required|email')]
public $email = '';
#[Rule('required|min:10')]
public $message = '';
public function submit()
{
$this->validate();
// Send message logic
$this->reset();
}
}
?>
Метод fill
Метод fill заполняет свойства формы значениями из массива.
Это удобно для редактирования существующих данных:
<?php
namespace App\Livewire\Forms;
use Livewire\Form;
use Livewire\Attributes\Rule;
class UserForm extends Form
{
#[Rule('required|min:3')]
public $name = '';
#[Rule('required|email')]
public $email = '';
public function loadUser($user)
{
$this->fill([
'name' => $user->name,
'email' => $user->email
]);
}
}
?>
Метод only
Метод only возвращает только указанные свойства формы в виде массива:
<?php
namespace App\Livewire\Forms;
use Livewire\Form;
use Livewire\Attributes\Rule;
class SettingsForm extends Form
{
#[Rule('required')]
public $theme = 'light';
#[Rule('required|in:en,ru')]
public $locale = 'en';
#[Rule('nullable|email')]
public $notification_email = '';
public function getSettings()
{
return $this->only(['theme', 'locale']);
}
}
?>
Смотрите также
-
метод
validate,
который выполняет валидацию всех свойств формы -
метод
validateOnly,
который выполняет валидацию одного поля формы -
метод
reset,
который сбрасывает свойства формы к начальным значениям -
метод
fill,
который заполняет свойства формы значениями из массива