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é
- Přehled formulářů — kompletní Form API
- Životní cyklus ukládání — hooky v pořadí
- Rozšíření formulářů — když recept potřebuje nové pole
- Přehled tabulek — sloupce, filtry, akce
- Core Pluginy — pravidla pro celou aplikaci přes hooky a pipes