Метод only класса Form
Метод only класса Form используется для извлечения
определенных полей из данных формы. Он принимает массив ключей
и возвращает массив, содержащий только те значения данных формы,
которые соответствуют переданным ключам. Этот метод полезен,
когда нужно выбрать конкретные поля из всей формы, например,
для сохранения в базу данных или для дальнейшей обработки.
Синтаксис
<?php
$form->only(['field1', 'field2']);
?>
Метод принимает один параметр:
- массив ключей (полей формы), которые нужно извлечь
Пример
Давайте создадим компонент с формой регистрации и используем
метод only для получения только нужных полей:
<?php
namespace AppLivewire;
use LivewireComponent;
use LivewireForm;
class RegistrationForm extends Component
{
public Form $form;
public function mount()
{
$this->form = new Form($this, [
'name' => '',
'email' => '',
'password' => '',
'password_confirmation' => '',
'agree_terms' => false,
]);
}
public function save()
{
$data = $this->form->only(['name', 'email', 'password']);
dd($data);
}
public function render()
{
return view('livewire.registration-form');
}
}
?>
<form wire:submit="save">
<input type="text" wire:model="form.name" placeholder="Name">
<input type="email" wire:model="form.email" placeholder="Email">
<input type="password" wire:model="form.password" placeholder="Password">
<input type="password" wire:model="form.password_confirmation" placeholder="Confirm Password">
<input type="checkbox" wire:model="form.agree_terms"> Agree Terms
<button type="submit">Save</button>
</form>
После отправки формы метод only извлечет только
поля 'name', 'email' и 'password':
[
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'secret123',
]
Поля 'password_confirmation' и 'agree_terms' не будут включены в результат.
Пример
Метод only также может быть полезен при обновлении
модели, когда нужно выбрать только определенные поля:
<?php
namespace AppLivewire;
use AppModelsUser;
use LivewireComponent;
use LivewireForm;
class ProfileForm extends Component
{
public Form $form;
public function mount(User $user)
{
$this->form = new Form($this, $user->toArray());
}
public function update()
{
$data = $this->form->only(['name', 'email', 'phone']);
auth()->user()->update($data);
session()->flash('message', 'Profile updated');
}
public function render()
{
return view('livewire.profile-form');
}
}
?>
<form wire:submit="update">
<input type="text" wire:model="form.name" placeholder="Name">
<input type="email" wire:model="form.email" placeholder="Email">
<input type="text" wire:model="form.phone" placeholder="Phone">
<input type="text" wire:model="form.address" placeholder="Address">
<button type="submit">Update</button>
</form>
При обновлении профиля извлекаются только поля name, email и phone:
[
'name' => 'John Doe',
'email' => 'john@example.com',
'phone' => '+1234567890',
]
Поле 'address' игнорируется при обновлении модели.
Пример
Метод only можно комбинировать с валидацией для
проверки только определенных полей:
<?php
namespace AppLivewire;
use LivewireComponent;
use LivewireForm;
class OrderForm extends Component
{
public Form $form;
public function mount()
{
$this->form = new Form($this, [
'product_id' => '',
'quantity' => 1,
'delivery_address' => '',
'payment_method' => 'cash',
'comment' => '',
]);
}
public function placeOrder()
{
$data = $this->form->only(['product_id', 'quantity', 'delivery_address']);
$this->form->validate([
'product_id' => 'required|exists:products,id',
'quantity' => 'required|integer|min:1',
'delivery_address' => 'required|string|max:255',
]);
// Создание заказа
}
public function render()
{
return view('livewire.order-form');
}
}
?>
<form wire:submit="placeOrder">
<input type="number" wire:model="form.product_id" placeholder="Product ID">
<input type="number" wire:model="form.quantity" placeholder="Quantity">
<textarea wire:model="form.delivery_address" placeholder="Delivery Address"></textarea>
<select wire:model="form.payment_method">
<option value="cash">Cash</option>
<option value="card">Card</option>
</select>
<textarea wire:model="form.comment" placeholder="Comment"></textarea>
<button type="submit">Place Order</button>
</form>
В этом примере метод only выделяет необходимые поля
перед валидацией:
[
'product_id' => '5',
'quantity' => '2',
'delivery_address' => '123 Main Street',
]
Поля 'payment_method' и 'comment' не участвуют в валидации.