NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

Balík funguje bez akejkoľvek konfigurácie. config/notifications.php publikujte, len ak chcete niečo zmeniť:

php artisan vendor:publish --tag="notifications-config"

Každá hodnota sa číta prísne: preklep vyhodí výnimku s názvom kľúča a prázdna env hodnota (KEY=) znamená „nenastavené“ — platí predvolená hodnota.

  • Doby sú v ISO-8601 (PT5M, P1D); časy sú miestne HH:MM.
  • Prepínače prijímajú true/false, 1/0, on/off a yes/no.
  • Celé čísla musia byť v rozsahu uvedenom v tabuľke; hodnota mimo neho vyhodí výnimku, neoreže sa.
  • Kľúče s triedami (resolvery, resources) musia uvádzať triedu správneho druhu; čokoľvek iné vyhodí výnimku s názvom kľúča.

Konfiguračný súbor

use RoundlyConsulting\Notifications\Http\Resources\NotificationActorResource;
use RoundlyConsulting\Notifications\Http\Resources\NotificationContextResource;
use RoundlyConsulting\Notifications\Http\Resources\NotificationSubjectResource;
use RoundlyConsulting\Notifications\Models\DigestRun;
use RoundlyConsulting\Notifications\Models\InboxItem;
use RoundlyConsulting\Notifications\Models\NotificationDelivery;
use RoundlyConsulting\Notifications\Models\NotificationReceipt;
use RoundlyConsulting\Notifications\Models\NotificationReminder;
use RoundlyConsulting\Notifications\Recipients\ContractGroupResolver;
use RoundlyConsulting\Notifications\Support\DefaultTimezoneResolver;

return [
    'types' => [],

    'key_type' => env('NOTIFICATIONS_KEY_TYPE', 'bigint'),
    'subject_key_type' => env('NOTIFICATIONS_SUBJECT_KEY_TYPE'),
    'context_key_type' => env('NOTIFICATIONS_CONTEXT_KEY_TYPE'),
    'primary_key_type' => env('NOTIFICATIONS_PRIMARY_KEY_TYPE', 'bigint'),

    'models' => [
        'inbox_item' => InboxItem::class,
        'delivery' => NotificationDelivery::class,
        'reminder' => NotificationReminder::class,
        'digest_run' => DigestRun::class,
        'receipt' => NotificationReceipt::class,
    ],

    'tables' => [
        'inbox_items' => 'notification_inbox_items',
        'deliveries' => 'notification_deliveries',
        'reminders' => 'notification_reminders',
        'digest_runs' => 'notification_digest_runs',
        'receipts' => 'notification_receipts',
    ],

    'queue' => [
        'enabled' => env('NOTIFICATIONS_QUEUE_ENABLED', true),
        'connection' => env('NOTIFICATIONS_QUEUE_CONNECTION'),
        'queue' => env('NOTIFICATIONS_QUEUE_NAME'),
    ],

    'fan_out' => [
        'queue_above' => 50,
        'chunk' => 100,
    ],

    'access' => [
        'ability' => 'view',
    ],

    'recipients' => [
        'group_resolver' => ContractGroupResolver::class,
    ],

    'idempotency' => [
        'ttl' => 'P30D',
    ],

    'inbox' => [
        'per_page' => 20,
        'max_per_page' => 100,
        'max_data_bytes' => 16384,
        'recheck_on_read' => env('NOTIFICATIONS_INBOX_RECHECK', false),
        'on_subject_deleted' => 'keep',
    ],

    'preferences' => [
        'inbox_mutable' => false,
        'lock_store' => env('NOTIFICATIONS_LOCK_STORE'),
        'lock_seconds' => 10,
    ],

    'mail' => [
        'strategy' => 'leading',
        'minimal_for_sensitive' => true,
        'address_resolver' => null,
        'preferences_url' => env('NOTIFICATIONS_PREFERENCES_URL'),
        'max_attempts' => 3,
        'backoff' => [60, 300, 900],
        'lease' => 'PT10M',
    ],

    'quiet_hours' => [
        'enabled' => true,
        'default' => null,
    ],

    'timezone' => [
        'resolver' => DefaultTimezoneResolver::class,
        'attribute' => 'timezone',
    ],

    'digest' => [
        'default' => 'off',
        'time' => '08:00',
        'weekly_day' => 'monday',
        'max_items' => 50,
        'lease' => 'PT15M',
    ],

    'reminders' => [
        'max_lateness' => 'P1D',
        'batch' => 500,
        'lease' => 'PT10M',
    ],

    'interop' => [
        'map' => [],
        'suppress' => [],
        'database' => 'redirect',
        'hold' => true,
        'notifiables' => [],
    ],

    'routes' => [
        'enabled' => env('NOTIFICATIONS_ROUTES_ENABLED', 'off'),
        'prefix' => 'notifications',
        'middleware' => ['api'],
        'auth_middleware' => ['auth'],
    ],

    'resources' => [
        'actor' => NotificationActorResource::class,
        'subject' => NotificationSubjectResource::class,
        'context' => NotificationContextResource::class,
    ],

    'prune' => [
        'inbox_after' => 'P180D',
        'deliveries_after' => 'P30D',
        'digest_runs_after' => 'P90D',
        'reminders_after' => 'P90D',
    ],
];

Druhy a typy kľúčov

KľúčEnvPredvolenéÚčel
types—[]Vaše druhy notifikácií: class-stringy tried, ktoré rozširujú NotificationType, vytvorené cez kontajner pri prvom použití. Čokoľvek iné vyhodí výnimku s názvom kľúča. Fluentné druhy pridáte cez Notifications::define().
key_typeNOTIFICATIONS_KEY_TYPEbigintKľúč príjemcov a aktérov — bigint, uuid alebo ulid. Musí sa zhodovať s typom kľúča vašich používateľov aj s options.key_type, pretože preferencie sa ukladajú pre každého používateľa cez options-for-laravel.
subject_key_typeNOTIFICATIONS_SUBJECT_KEY_TYPEblank = key_typeKľúč každého modelu subjektu.
context_key_typeNOTIFICATIONS_CONTEXT_KEY_TYPEblank = key_typeKľúč každého modelu kontextu.
primary_key_typeNOTIFICATIONS_PRIMARY_KEY_TYPEbigintVlastné id tabuliek balíka a cudzie kľúče medzi nimi. Čítajú ho migrácie — nastavte ho pred migráciou.

Modely a tabuľky

KľúčEnvPredvolenéÚčel
models.inbox_item—InboxItem::classModel vymeníte tak, že rozšírite triedu z balíka a uvediete tu podtriedu.
models.delivery—NotificationDelivery::classJeden riadok e-mailu na príjemcu, druh, subjekt a kontext v rámci okna.
models.reminder—NotificationReminder::classRiadky pripomienok a eskalácií.
models.digest_run—DigestRun::classJeden riadok na príjemcu, frekvenciu a obdobie — evidencia súhrnov.
models.receipt—NotificationReceipt::classPotvrdenky idempotencie.
tables.inbox_items—notification_inbox_itemsMalé písmená, číslice a podčiarkovníky, najviac 30 znakov — MySQL obmedzuje názvy indexov na 64.
tables.deliveries—notification_deliveriesNajviac 30 znakov.
tables.reminders—notification_remindersNajviac 24 znakov.
tables.digest_runs—notification_digest_runsNajviac 30 znakov.
tables.receipts—notification_receiptsNajviac 30 znakov.

Front a rozposielanie

KľúčEnvPredvolenéÚčel
queue.enabledNOTIFICATIONS_QUEUE_ENABLEDtrueSpúšťa úlohy e-mailov, súhrnov a rozposielania vo fronte. Vypnuté: bežia priamo po commite.
queue.connectionNOTIFICATIONS_QUEUE_CONNECTIONblank = defaultSpojenie frontu pre tieto úlohy.
queue.queueNOTIFICATIONS_QUEUE_NAMEblank = defaultNázov frontu pre tieto úlohy.
fan_out.queue_above—50Viac vyhodnotených príjemcov, než je táto hodnota, doručia úlohy vo fronte (najmenej 1).
fan_out.chunk—100Príjemcovia na jednu úlohu rozposielania, 1–10000; každá úloha znovu overí prístup.

Prístup, príjemcovia a idempotencia

KľúčEnvPredvolenéÚčel
access.ability—viewGate oprávnenie, ktoré predvolená kontrola prístupu overuje na subjekte.
recipients.group_resolver—ContractGroupResolver::classTrieda ResolvesGroupMembers za Recipients::role() a Recipients::members().
idempotency.ttl—P30DAko dlho sa pamätá kľúč idempotencie (->once(), odoslanie pripomienok a eskalácií); potvrdenky sa potom vymažú.

Schránka

KľúčEnvPredvolenéÚčel
inbox.per_page—20Predvolená veľkosť stránky, od 1 po inbox.max_per_page.
inbox.max_per_page—100Najväčšia stránka a limit pre get(), 1–1000.
inbox.max_data_bytes—16384Limit veľkosti JSON dát jedného odoslania, 256–1048576 bajtov.
inbox.recheck_on_readNOTIFICATIONS_INBOX_RECHECKfalseSkryje položky, ku ktorých subjektu čitateľ už nemá prístup, po stránkach (počty zostávajú surové).
inbox.on_subject_deleted—keepČo sa stane s položkami schránky pri zmazaní subjektu: keep, archive alebo delete. Platí pre subjekty s HasNotificationReminders.

Preferencie

KľúčEnvPredvolenéÚčel
preferences.inbox_mutable—falseVypnuté: stlmenie zastaví len e-mail — schránka položku vždy ponechá.
preferences.lock_storeNOTIFICATIONS_LOCK_STOREblank = default cacheCache store pre zámok zápisu preferencií. Musí byť zdieľaný medzi servermi a podporovať atomické zámky; store bez zámkov vyhodí výnimku s názvom kľúča.
preferences.lock_seconds—10Ako dlho sa zámok drží, 1–300 sekúnd.

E-mail

KľúčEnvPredvolenéÚčel
mail.strategy—leadingleading: prvá udalosť odošle e-mail, ďalšie v okne sa doň zlúčia. trailing: jeden e-mail po skončení okna s konečným počtom.
mail.minimal_for_sensitive—trueSubjekty, ktoré druh označí ako sensitive(), dostanú len e-mail s nadpisom a odkazom.
mail.address_resolver—nullTrieda ResolvesMailAddress, ktorá určuje adresu každého e-mailu — typovaných aj súhrnov. null smeruje cez príjemcu.
mail.preferences_urlNOTIFICATIONS_PREFERENCES_URLnullURL alebo názov route pre odkaz „spravovať notifikácie“ v pätičke.
mail.max_attempts—3Počet pokusov o odoslanie e-mailu aj súhrnu, 1–20.
mail.backoff—[60, 300, 900]Sekundy medzi pokusmi — neprázdny zoznam kladných celých čísel.
mail.lease—PT10ME-mail prevzatý na odoslanie dlhšie, než je táto doba, sa označí ako zlyhaný a nikdy sa nepošle znova (najviac raz).

Tiché hodiny a časové pásmo

KľúčEnvPredvolenéÚčel
quiet_hours.enabled—trueGlobálny prepínač.
quiet_hours.default—nullTiché hodiny používateľov bez vlastných, napr. ['start' => '22:00', 'end' => '07:00']; rovnaké časy vyhodia výnimku.
timezone.resolver—DefaultTimezoneResolver::classTrieda ResolvesTimezone.
timezone.attribute—timezoneAtribút príjemcu s časovým pásmom IANA; prázdna hodnota ho vypne.

Súhrny

KľúčEnvPredvolenéÚčel
digest.default—offoff, daily alebo weekly — frekvencia používateľov bez vlastnej preferencie.
digest.time—08:00Miestny čas HH:MM.
digest.weekly_day—mondayDeň týždenného súhrnu, monday–sunday.
digest.max_items—50Riadky v jednom súhrne, 1–1000; zvyšok je „a :count ďalších položiek v schránke“.
digest.lease—PT15MSúhrn, ktorý sa po tejto dobe stále odosiela, zlyhá aj so svojimi položkami.

Pripomienky

KľúčEnvPredvolenéÚčel
reminders.max_lateness—P1DPripomienka oneskorená viac než o túto dobu (po výpadku), ktorej dátum už prešiel, sa preskočí.
reminders.batch—500Splatné riadky odoslané za jeden sweep, 1–10000.
reminders.lease—PT10MRiadok, ktorý sa po tejto dobe stále odosiela, sa vráti do stavu pending; opakované odoslanie nič nepošle dvakrát.

Notifikácie iných balíkov

KľúčEnvPredvolenéÚčel
interop.map—[]Trieda notifikácie => kľúč jedného z vašich druhov.
interop.suppress—[]Zoznam tried (všetky kanály) alebo trieda => zoznam kanálov.
interop.database—redirectMapovaný kanál database: redirect (do schránky), keep alebo both.
interop.hold—truePodrží mapované e-maily počas tichých hodín.
interop.notifiables—[]Ďalšie triedy príjemcov; modely s ReceivesNotifications sa rátajú vždy.

JSON API a resources

KľúčEnvPredvolenéÚčel
routes.enabledNOTIFICATIONS_ROUTES_ENABLEDoffSprístupní JSON API — vypnuté, kým ho nezapnete.
routes.prefix—notificationsPrefix URI; lomky na okrajoch sa odstránia. Názvy route začínajú na notifications.
routes.middleware—['api']Middleware každého endpointu.
routes.auth_middleware—['auth']Autentifikačné middleware, napr. ['auth:sanctum']. Prázdny zoznam sa rešpektuje — controllery bez používateľa aj tak odpovedia 401.
resources.actor—NotificationActorResource::classJsonResource, cez ktorý sa vykreslí aktér položky; dostane model aktéra.
resources.subject—NotificationSubjectResource::classDostane model subjektu.
resources.context—NotificationContextResource::classDostane ContextReference (kľúč, popis, morph typ a id). Prázdna hodnota alebo null = predvolené; čokoľvek, čo nie je inštanciovateľný potomok JsonResource, vyhodí výnimku s názvom kľúča.

Čistenie

KľúčEnvPredvolenéÚčel
prune.inbox_after—P180DPrečítané a archivované (alebo zmazané) položky schránky staršie než táto doba.
prune.deliveries_after—P30DUkončené doručenia.
prune.digest_runs_after—P90DDokončené súhrny bez živej položky.
prune.reminders_after—P90DUkončené pripomienky bez čakajúcej či odosielanej eskalácie. Každá doba čistenia je aspoň hodina.

Prostredie

NOTIFICATIONS_KEY_TYPE=bigint
NOTIFICATIONS_SUBJECT_KEY_TYPE=
NOTIFICATIONS_CONTEXT_KEY_TYPE=
NOTIFICATIONS_PRIMARY_KEY_TYPE=bigint
NOTIFICATIONS_QUEUE_ENABLED=true
NOTIFICATIONS_QUEUE_CONNECTION=
NOTIFICATIONS_QUEUE_NAME=
NOTIFICATIONS_INBOX_RECHECK=false
NOTIFICATIONS_LOCK_STORE=redis
NOTIFICATIONS_PREFERENCES_URL=settings.notifications
NOTIFICATIONS_ROUTES_ENABLED=on

V phpunit.xml píšte on/off (alebo 1/0): PHPUnit zmení false na prázdny reťazec, čo znamená „nenastavené“.

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 kryptomien

Odoslaní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.