In my form, name validates correct, but not amount. If I type in a string, like abc into the forms amount field, a 0 is inserted into the database. I expect a validation error to be thrown instead.
<?php
namespace App\Livewire\Forms;
use App\Models\Invoice;
use Livewire\Form;
use Illuminate\Validation\Rule;
class InvoiceForm extends Form
{
public ?Invoice $invoice = null;
public string $name = '';
public $amount = null;
public function setInvoice(?Invoice $invoice = null): void
{
$this->invoice = $invoice;
$this->name = $invoice->name;
$this->amount = $invoice->amount;
}
public function save(): void
{
$validated = $this->validate();
$amount = $validated['amount'] ? (int) $validated['amount'] : null;
if (empty($this->invoice)) {
Invoice::create(array_merge($this->only(['name']), ['amount' => $amount]));
} else {
$this->invoice->update(array_merge($this->only(['name']), ['amount' => $amount]));
}
$this->reset();
}
public function rules(): array
{
return [
'name' => [
'required',
Rule::unique('invoices', 'name')->ignore($this->component->invoice),
],
'amount' => [
['nullable', 'integer']
],
];
}
public function validationAttributes(): array
{
return [
'name' => 'name',
'amount' => 'amount',
];
}
}
<div class="p-6">
<form wire:submit="save">
<div>
<x-input-label for="name" :value="__('Name')" />
<x-text-input wire:model="form.name" id="name" class="mt-1 block w-full" type="text" />
<x-input-error :messages="$errors->get('form.name')" class="mt-2" />
</div>
<div class="mt-4">
<x-input-label for="amount" :value="__('Amount')" />
<x-text-input wire:model="form.amount" id="amount" class="mt-1 block w-full" type="text"/>
<x-input-error :messages="$errors->get('form.amount')" class="mt-2" />
</div>
<div class="mt-4">
<x-primary-button>
{{ __('Save') }}
</x-primary-button>
</div>
</form>
</div>
<?php
namespace App\Livewire;
use App\Models\Invoice;
use Illuminate\Contracts\View\View;
use LivewireUI\Modal\ModalComponent;
class InvoiceModal extends ModalComponent
{
public ?Invoice $invoice = null;
public Forms\InvoiceForm $form;
public function mount(Invoice $invoice = null): void
{
if ($invoice->exists) {
$this->form->setInvoice($invoice);
}
}
public function save(): void
{
$this->form->save();
$this->closeModal();
$this->dispatch('refresh-list');
}
public function render(): View
{
return view('livewire.invoice-modal');
}
}