Preferencie
Každý používateľ rozhoduje pre každý druh, kategóriu a kanál. Stlmenie predvolene zastaví len e-mail — schránka položku ponechá — a povinné druhy sa stlmiť nedajú vôbec:
use RoundlyConsulting\Notifications\Enums\Channel;
$prefs = Notifications::preferences($user); // or $user->notificationPreferences()
$prefs->mute('comment.posted'); // mail only by default — the inbox keeps the item
$prefs->mute('comment.posted', Channel::Inbox); // one channel (honoured only with inbox muting on)
$prefs->unmute('comment.posted'); // back to the category and type default
$prefs->set('request.awaiting_approval', Channel::Mail, false);
$prefs->muteCategory('comments');
$prefs->unmuteCategory('comments');
$prefs->reset(); // every type and category override forgotten
$prefs->mute('security.alert'); // MandatoryNotificationException
$prefs->muteCategory('comment'); // UnknownNotificationCategoryException — no type uses itVýsledný kanál
Pre druh T, kanál C a používateľa U: C nie je v T.channels() → vypnuté; T.mandatory() → zapnuté; C je schránka a notifications.preferences.inbox_mutable je vypnuté → zapnuté; inak prepis druhu → prepis kategórie → T.enabledByDefault(C). Ukladajú sa len prepisy, takže zmenená predvolená hodnota druhu sa dostane ku každému, kto ju nemenil.
- Stlmenie kategórie neumlčí povinný druh v nej; uložené stlmenie druhu, ktorý sa neskôr stal povinným, sa ignoruje.
- Kategória, ktorú žiadny zaregistrovaný druh nepoužíva, sa pri každom zápise odmietne s UnknownNotificationCategoryException — preklep nikdy potichu nestlmí nič.
- Každý zápis odstráni uložené prepisy nezaregistrovaných druhov a nepoužitých kategórií.
Čítanie pre obrazovku nastavení
$prefs->matrix(); // list<PreferenceRow{type: TypeDefinition, channels: list<ChannelPreference>}>
$prefs->enabled('comment.posted', Channel::Mail); // bool
$prefs->muted('comment.posted'); // mail off?
$prefs->overview(); // PreferencesOverview: rows, digest, quietHours, timezone
$prefs->digestPreference(); // DigestPreferenceData
$prefs->quietHoursPreference(); // ?QuietHours
$prefs->resolvedTimezone(); // 'Europe/Bratislava'ChannelPreference nesie channel, enabled, default a locked — zamknuté sú povinné druhy a schránka, ak nie je zapnuté jej stlmovanie.
Viac zmien naraz
update() uloží celú obrazovku nastavení naraz alebo vôbec — používa ho PATCH /preferences. Zmení sa len to, čo update uvádza:
use RoundlyConsulting\Notifications\DataTransferObjects\DigestPreferenceData;
use RoundlyConsulting\Notifications\DataTransferObjects\PreferencesUpdate;
use RoundlyConsulting\Notifications\DataTransferObjects\QuietHours;
use RoundlyConsulting\Notifications\Enums\DigestFrequency;
Notifications::preferences($user)->update(new PreferencesUpdate(
channels: ['comment.posted' => ['mail' => false]], // type → channel → on/off
categories: ['contracts' => ['mail' => false]], // false mutes, true clears the mute
digest: new DigestPreferenceData(DigestFrequency::Daily, '08:00'),
setsQuietHours: true, quietHours: new QuietHours('22:00', '07:00'), // setsQuietHours + null clears
setsTimezone: true, timezone: 'Europe/Bratislava', // setsTimezone + null clears
));Najprv sa overí všetko — nezaregistrovaný druh, iný kanál než inbox či mail, vypnutý povinný druh, nepoužitá kategória, zlý čas alebo časové pásmo vyhodí výnimku skôr, než sa čokoľvek zapíše. Potom bežia všetky zápisy pod jedným zámkom preferencií v jednej transakcii, takže zlyhanie v polovici vráti všetky.
Uloženie
Štyri options z options-for-laravel, ktoré balík registruje, každá s vlastným kľúčom. Vlastníkom je používateľ, preto sa options.key_type musí zhodovať s notifications.key_type. Čítanie aj zápis obchádzajú autorizáciu options — hranicou je API balíka a HTTP vrstva vždy pracuje len s prihláseným používateľom:
| Option | Kľúč | Hodnota |
|---|---|---|
Options\ChannelPreferences | notifications.channels | {"types": {"<key>": {"mail": false}}, "categories": {"<cat>": {"mail": false}}} |
Options\DigestPreference | notifications.digest | {"frequency": "daily", "time": "07:30"} |
Options\QuietHoursPreference | notifications.quiet_hours | {"start": "22:00", "end": "07:00"} |
Options\TimezonePreference | notifications.timezone | IANA id |
Súbežnosť a udalosti
Zápis je čítanie, úprava a zápis JSON mapy. Okolo celej transakcie drží cache zámok (notifications.preferences.lock_store, na lock_seconds) a uvoľní ho po commite — v transakcii aplikácie až po jej commite — takže dve súbežné stlmenia rôznych druhov prežijú obe. Store zámku musí byť zdieľaný medzi servermi; doctor upozorní na array a file. Každý zápis po commite spustí NotificationPreferenceChanged a zmeny súhrnu, tichých hodín či časového pásma v tej istej transakcii prečasujú podržané a odložené e-maily používateľa.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.