Core
Notifikace
Zásuvný notifikační systém s více drivery.
Na této stránce
- Drivery
- Který driver na co?
- Notification builder
- API Notification
- Použití v akcích
- Použití v komponentách
- Použití ve formulářích
- Konfigurace
- Pořadí resolvování driveru
- Vlastní drivery
- Blade komponenta
- Toasty
- Odpočtová lišta
- Trvalé toasty
- Akční tlačítka
- Skládání a přetečení
- Přístupnost
- Spouštění toastů z JavaScriptu
Zásuvný notifikační systém s více drivery.
Drivery
| Driver | Třída | Doručení | Požadavky |
|---|---|---|---|
| Aktuální komponenta | CurrentComponentDriver |
Dekorátor — resolvuje aktivní Livewire komponentu přes Livewire::current(), pak deleguje na obalený driver (výchozí SessionDriver) |
Žádné (výchozí) |
| Session | SessionDriver |
session()->flash() + Livewire událost nesoucí plný payload |
Žádné |
| Livewire | LivewireEventDriver |
Livewire $dispatch() browser událost s plným payloadem |
Frontend listener (toast kontejner) |
| Flasher | FlasherDriver |
Integrace PHP Flasher | php-flasher/flasher-laravel |
| Null | NullDriver |
No-op — zahodí vše | Žádné |
Vestavěný výchozí je CurrentComponentDriver obalující SessionDriver: sám resolvuje právě renderovanou Livewire komponentu, takže call-sites nikdy nemusí předávat $this. SessionDriver i LivewireEventDriver forwardují plný payload (title, duration, icon, actions, …), takže bohaté toasty přežijí server round-trip.
Který driver na co?
| Použijte tento driver, když… | Driver |
|---|---|
| Chcete zpětnou vazbu bez nastavení, která přežije redirecty / plná načtení stránky (flash), s bonusem základního live toastu — dobrý výchozí pro server-rendered a redirect-after-action toky. | SessionDriver |
Vaše UI je toast kontejner a chcete bohaté, okamžité toasty (titulek, trvání, ikona) bez reloadu. Doporučená kombinace s <x-wire-notifications::toast-container />. |
LivewireEventDriver |
| Vaše aplikace už používá php-flasher (adaptéry Toastr / Notyf / SweetAlert) a chcete, aby notifikace tekly do toho existujícího UI. | FlasherDriver |
| Chcete vypnout notifikace — testy, queued/background joby nebo jakýkoli kontext bez uživatele, kterého notifikovat. | NullDriver |
Které drivery krmí toast kontejner?
<x-wire-notifications::toast-container />je Alpine listener na Livewire browser události, takže ho dosáhnou jen drivery odesílající události: výchozíCurrentComponentDriver,SessionDriveraLivewireEventDriver— všechny forwardují plnýtitle/duration/icon/actionspayload.FlasherDrivervykresluje vlastní UI a kontejner obchází;NullDrivernezobrazí nic.
Notification builder
Notification je immutable hodnotový objekt. Vytvořte přes statickou factory, pak odešlete přes NotificationManager.
use NyonCode\WireCore\Notifications\Notification;use NyonCode\WireCore\Notifications\NotificationManager; // Zkratkové factory — vytvořit a odeslat okamžitěNotificationManager::success('User saved');NotificationManager::error('Failed to delete'); // Sestavit notifikaci, pak odeslat$notification = Notification::success('The user was successfully updated.') ->title('Record Saved'); NotificationManager::send($notification); // Plné přizpůsobení$notification = Notification::make('success', 'Changes saved.') ->title('Done') ->icon('check') ->duration(5000) // ms, 0 = trvalé ->position('top-right') // top-right, top-left, bottom-right, bottom-left ->extra(['link' => '/details']); NotificationManager::send($notification);
API Notification
// Statické factory (vrací novou instanci Notification)Notification::make(string $type, string $message): staticNotification::success(string $message): staticNotification::error(string $message): staticNotification::warning(string $message): staticNotification::info(string $message): static // Fluent immutable modifikátory (každý vrací novou instanci)->title(?string $title): static->duration(?int $ms): static // čas auto-zavření, 0 = trvalé->persistent(bool $on = true): static // sticky toast: duration 0, bez odpočtové lišty->icon(?string $icon): static->position(?string $position): static->extra(array $data): static // libovolná extra data (sloučená)->action(NotificationAction|string $action, ?string $event = null): static // přidat akční tlačítko->actions(array $actions): static // nahradit sadu akčních tlačítek->toArray(): array // serializovat do pole // Odesílání (přes NotificationManager)// $livewire je volitelný — výchozí CurrentComponentDriver si aktivní// komponentu resolvuje sám, takže ho běžně vynecháte.NotificationManager::send(Notification $n, ?NotificationDriver $driver = null, mixed $livewire = null): voidNotificationManager::success(string $message, ...): voidNotificationManager::error(string $message, ...): voidNotificationManager::warning(string $message, ...): voidNotificationManager::info(string $message, ...): void
Použití v akcích
Action::make('save') ->action(function ($record, Action $action) { $record->save(); $action->sendSuccessNotification(); }) ->successNotification('Saved!'); // Vlastní notifikace z akce$action->sendNotification( Notification::success('Done') ->title('Processed') ->duration(3000) ->icon('check'));
Použití v komponentách
use NyonCode\WireCore\Notifications\Concerns\InteractsWithNotifications;use NyonCode\WireCore\Notifications\Notification; class MyComponent extends Component{ use InteractsWithNotifications; public function save(): void { // ... save logika // Typové zkratky (berou řetězec zprávy) $this->notifySuccess('Record saved'); $this->notifyError('Save failed'); $this->notifyWarning('Careful'); $this->notifyInfo('Heads up'); // Nebo odeslat plně sestavenou Notification $this->notify( Notification::success('Record saved')->title('Done')->duration(5000) ); }}
Použití ve formulářích
Formuláře automaticky odešlou úspěšnou notifikaci po save(), pokud není vypnuta:
Form::make() ->schema([...]) ->model(User::class) ->successMessage('User saved!') // vlastní zpráva ->save(); // VypnoutForm::make() ->schema([...]) ->disableSuccessNotification() ->save();
Konfigurace
// config/wire-core.phpreturn [ 'notifications' => [ 'default' => env('WIRE_NOTIFICATIONS_DRIVER', 'session'), // session, livewire, flasher, null ],];
Tato config hodnota řídí container-bound NotificationDriver (resolvovaný service providerem pro constructor/app() injekci).
Pořadí resolvování driveru
Když zavoláte NotificationManager::send() (nebo jeho zkratky), driver se resolvuje v tomto pořadí:
- Explicitní driver předaný do volání / komponenty (
setNotificationDriver(), argument$driver) - Globální výchozí nastavený přes
NotificationManager::setDefaultDriver() - Fallback: vestavěný
CurrentComponentDriverobalujícíSessionDriver
Poznámka: statický
NotificationManagernečtewire-core.notifications.defaultsám o sobě — ta config jen krmí container binding. Aby se nakonfigurovaný driver stal globálním výchozím pro statické API, přemostěte ho jednou v service provideru:use NyonCode\WireCore\Notifications\Contracts\NotificationDriver;use NyonCode\WireCore\Notifications\NotificationManager;NotificationManager::setDefaultDriver(app(NotificationDriver::class));
Vlastní drivery
Implementujte kontrakt NotificationDriver — jeho jediná metoda send() dostane notifikaci a (volitelně) Livewire komponentu v scope:
use NyonCode\WireCore\Notifications\Contracts\NotificationDriver;use NyonCode\WireCore\Notifications\Notification; class SlackDriver implements NotificationDriver{ public function send(Notification $notification, mixed $livewireComponent = null): void { Http::post('https://hooks.slack.com/...', [ 'text' => $notification->title . ': ' . $notification->message, ]); }}
Zaregistrujte ho jako globální výchozí v service provideru (boot()):
use NyonCode\WireCore\Notifications\NotificationManager; NotificationManager::setDefaultDriver(new SlackDriver());
Nebo ho použijte pro jednu komponentu/volání bez změny globálního výchozího:
$this->setNotificationDriver(new SlackDriver()); // per-komponenta (trait)NotificationManager::send($notification, new SlackDriver()); // per-volání
Blade komponenta
Umístěte toast kontejner do svého layoutu:
<x-wire-notifications::toast-container />
Můžete přizpůsobit pozici, fallback trvání auto-zavření a browser událost, které naslouchá:
<x-wire-notifications::toast-container position="bottom-right" :duration="5000" event-name="table-notification" />
| Prop | Výchozí | Účel |
|---|---|---|
position |
top-right |
top-left / top-center / top-right / bottom-left / bottom-center / bottom-right |
duration |
4000 |
fallback auto-zavření (ms) pro notifikace bez vlastního duration |
event-name |
table-notification |
window událost, které naslouchá (x-on:{eventName}.window) |
progress |
true |
zobrazit per-toast odpočtovou lištu (viz níže) |
stack |
false |
sbalit toasty do hromádky, která se na hover rozevře |
max |
0 |
omezit počet viditelných toastů (0 = neomezeno); přebytek se sbalí do pillu „+N more“ |
Toasty
Vše níže vykresluje <x-wire-notifications::toast-container /> — drivery jen odesílají payloady; kontejner rozhoduje, jak toast vypadá a jak se chová.
Odpočtová lišta
Každý auto-zavírající toast má u spodní hrany tenkou odpočtovou lištu, která ubývá, jak toast stárne — uživatel tak vidí, za jak dlouho se zavře. Najetí na jakýkoli toast pauzuje lištu i auto-zavření (a po odjetí pokračuje). Lišta je defaultně zapnutá a obarvená podle typu notifikace.
- Je volitelná —
:progress="false"ji skryje. - Trvalé toasty lištu nemají — sticky toast neodpočítává, takže by neměl co ukazovat (viz níže).
<x-wire-notifications::toast-container :progress="false" /> {{-- bez odpočtové lišty --}}
Trvalé toasty
->persistent() (nebo ->duration(0)) udělá toast sticky: zůstane, dokud ho uživatel nezavře, a nemá odpočtovou lištu. Ideální pro zprávy vyžadující rozhodnutí.
NotificationManager::send( Notification::warning('Platba potřebuje kontrolu, než se zúčtuje.') ->title('Vyžaduje akci') ->persistent());
Akční tlačítka
Přidejte tlačítka, která po kliknutí dispatchnou Livewire událost — afordance „Undo". Hostitelská komponenta poslouchá přes #[On(...)].
use NyonCode\WireCore\Notifications\Notification;use NyonCode\WireCore\Notifications\NotificationAction; // zkratka: label + Livewire událostNotificationManager::send( Notification::success('Položka smazána')->action('Vrátit', 'restore-record')); // plná kontrolaNotificationManager::send( Notification::success('Objednávka #1042 uložena')->action( NotificationAction::make('Vrátit', 'restore-record') ->payload(['id' => 1042]) // odešle se s dispatchnutou událostí ->color('primary') // akcent tlačítka (fallback na typ toastu) ->keepOpen() // po kliknutí toast nezavírat ));
// v hostitelské Livewire komponentě#[On('restore-record')]public function restore(int $id): void{ // …}
NotificationAction je immutable hodnotový objekt: make(label, event), ->payload([...]), ->color(...), ->keepOpen(). Klik dispatchne Livewire.dispatch(event, payload) a (pokud není keepOpen()) zavře toast.
Skládání a přetečení
stacksbalí toasty do úhledné hromádky; najetí na hromádku je rozevře do plného seznamu. Nejnovější toast je nejblíže kotvící hraně.maxomezí, kolik je jich vidět naráz; přebytek se sbalí do klikacího pillu „+N more“, který odhalí zbytek.
<x-wire-notifications::toast-container stack :max="5" />
Přístupnost
Kontejner je aria-live="polite" region (error toasty používají role="alert"), takže screen readery toasty ohlašují, jak přicházejí. Ctí i prefers-reduced-motion: při požadavku na omezený pohyb se hromádka nikdy nesbaluje/nerozevírá a přechody karet jsou vypnuté.
Spouštění toastů z JavaScriptu
Toast kontejner nainstaluje globální helper window.wireToast (a Alpine $toast magic), když se namountuje, takže můžete vyvolat toast rovnou z frontendu — bez server round-tripu. Helper jen odešle eventName window událost kontejneru se standardním payloadem (type, message, title, duration).
// zkratka — type + messagewireToast.success('Saved');wireToast.error('Something went wrong');wireToast.warning('Careful');wireToast.info('Heads up'); // s volbami (title, duration, …)wireToast.success('Saved', { title: 'Done', duration: 6000 }); // plný payload objekt (type výchozí 'info' při vynechání)wireToast({ type: 'success', message: 'Saved', title: 'Done' });wireToast('Plain info toast');
Uvnitř Alpine použijte $toast magic:
<button @click="$toast.success('Copied!')">Copy</button>
Helper cílí na nakonfigurovaný eventName kontejneru, takže vlastní event-name="my-toast" je zapojeno automaticky. window.wireToast se nainstaluje jednou (vyhrává první kontejner); pokud vykreslíte více kontejnerů s různými názvy událostí, odešlete CustomEvent sami pro ty sekundární:
window.dispatchEvent(new CustomEvent('my-toast', { detail: { type: 'success', message: 'Saved' },}));