K

Začínáme

Kuchařka

Úlohově zaměřené recepty postavené na veřejném API. Každý je samostatný — zkopírujte ho do Livewire komponenty používající WithForms (nebo WithTable) a upravte.

Na této stránce

Úlohově zaměřené recepty postavené na veřejném API. Každý je samostatný — zkopírujte ho do Livewire komponenty používající WithForms (nebo WithTable) a upravte.

Chci… Recept
Zobrazit pole jen když má jiné pole hodnotu Podmíněná pole
Transformovat data před uložením Hashovat heslo při uložení
Načíst existující záznam do formuláře Editovat existující záznam
Nahradit výchozí perzistenci Vlastní save logika
Spustit side efekty po úspěšném uložení Side efekty po uložení
Zúžit tabulku na aktuálního uživatele/tenanta Zúžit dotaz tabulky
Předvyplnit výchozí hodnoty z requestu nebo auth uživatele Dynamické výchozí hodnoty

Podmíněná pole

Nastavte řídicí pole jako live(), aby Livewire při změně překreslil, pak čtěte stav formuláře v closuře visible(). Stav žije na vlastnosti komponenty svázané přes statePath, takže closura definovaná v form() může číst $this->data.

public ?array $data = [];
 
public function form(Form $form): Form
{
return $form->statePath('data')->schema([
Select::make('account_type')
->options(['personal' => 'Personal', 'business' => 'Business'])
->live()
->required(),
 
TextInput::make('company_name')
->label('Company name')
->visible(fn () => ($this->data['account_type'] ?? null) === 'business')
->required(),
]);
}

Closura je arrow funkce deklarovaná uvnitř form(), takže její $this je Livewire komponenta. Pro opak použijte hidden(), nebo vraťte libovolný boolean výraz pro složitější pravidla.


Hashovat heslo při uložení

mutateDataBeforeSave() transformuje pole zvalidovaných dat těsně před perzistencí — správné místo pro hashování, normalizaci nebo injektování polí.

use Illuminate\Support\Facades\Hash;
 
$form
->model(User::class)
->schema([
TextInput::make('email')->email()->required(),
TextInput::make('password')->password()->required()->rules(['confirmed']),
])
->mutateDataBeforeSave(fn (array $data): array => [
...$data,
'password' => Hash::make($data['password']),
]);

Pro aplikaci stejného pravidla na každý formulář v aplikaci použijte místo toho plugin hook form.saving — viz Core Pluginy.


Editovat existující záznam

Předejte instanci modelu (ne řetězec třídy) a naplňte z ní formulář. V edit módu save() volá update() na záznamu.

public User $user;
 
public ?array $data = [];
 
public function mount(User $user): void
{
$this->user = $user;
$this->form->fill($user->toArray());
}
 
public function form(Form $form): Form
{
return $form
->statePath('data')
->model($this->user) // instance ⇒ edit mód
->schema([
TextInput::make('name')->required(),
TextInput::make('email')->email()->required(),
]);
}

isEditing() zde vrací true; bylo by false, kdybyste předali User::class.


Vlastní save logika

Když výchozí create/update není to, co potřebujete — ukládání přes službu, API nebo ne-Eloquent cíl — nahraďte perzistenci pomocí using(). Dostane zvalidovaná data a její návratová hodnota se stane výsledkem save.

$form
->schema([
TextInput::make('name')->required(),
TextInput::make('email')->email()->required(),
])
->using(function (array $data) {
return app(UserProvisioner::class)->create($data);
});

Validace, mutateDataBeforeSave(), beforeSave() a afterSave() stále běží; nahrazuje se pouze krok perzistence.


Side efekty po uložení

afterSave() dostane uložený záznam — použijte ho pro notifikace, události nebo práci s relacemi, která potřebuje perzistovaný model.

$form
->model(Order::class)
->schema([/* … */])
->afterSave(function ($record): void {
OrderPlaced::dispatch($record);
$record->customer->notify(new OrderConfirmation($record));
});

Kompletní pořadí callbacků viz Životní cyklus ukládání.


Zúžit dotaz tabulky

Omezte jednu tabulku na aktuálního uživatele nebo tenanta pomocí modifyQueryUsing(). Běží jako součást query pipeline tabulky.

use Illuminate\Database\Eloquent\Builder;
 
public function table(Table $table): Table
{
return $table
->model(Order::class)
->modifyQueryUsing(fn (Builder $query) => $query->where('user_id', auth()->id()))
->columns([/* … */]);
}

Pro aplikaci stejného zúžení napříč mnoha tabulkami ho přesuňte do query pipe pluginu nebo hooku table.querying — viz Core Pluginy → Query Pipes.


Dynamické výchozí hodnoty

default() přijímá closuru resolvovanou v čase renderu, takže nový (create-mód) formulář může naplnit hodnoty z auth, requestu nebo config.

$form
->model(Post::class)
->schema([
TextInput::make('title')->required(),
Hidden::make('author_id')->default(fn () => auth()->id()),
Select::make('status')->options(Status::options())->default('draft'),
]);

Výchozí hodnoty se aplikují jen když pole ještě nemá hodnotu, takže nepřepíší editovaný záznam.


Viz také