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

Príjemcovia a prístup

Príjemcovia sa vyhodnotia pri odoslaní spolu so subjektom — žiadna e-mailová adresa nie je napevno v kóde:

use RoundlyConsulting\Notifications\Recipients;

Recipients::users($anna, $boris, $collection, null);       // explicit models; nulls dropped
Recipients::role($request->company, 'approver');           // through the group resolver
Recipients::members($team);                                 // every member
Recipients::owner();                                        // HasNotificationOwner::notificationOwner()
Recipients::owner('accountManager');                        // …else this relation
Recipients::using(OnCallResolver::class, ['level' => 2]);   // your RecipientResolver, scalar args
Recipients::merge(Recipients::owner(), Recipients::role($company, 'manager'));

// A plain model, a collection or an array works wherever recipients are expected
Notifications::send('security.alert', null, $user);
Notifications::send('security.alert', null, User::query()->where('is_admin', true)->get());
SpecVyhodnotenieUložiteľné
Recipients::users($a, $b, $collection, null)Modely; null hodnoty vypadnú, nie-model vyhodí InvalidRecipientException.✓
Recipients::role($group, 'approver')Group resolver (notifications.recipients.group_resolver), členovia s rolou. Skupina môže byť closure nad subjektom.✓ (nie so skupinou ako closure)
Recipients::members($group)To isté, všetci členovia.✓ (nie so skupinou ako closure)
Recipients::owner(?string $relation)HasNotificationOwner::notificationOwner(), inak uvedený vzťah, inak NoOwnerException.✓
Recipients::using(MyResolver::class, ['level' => 2])MyResolver::resolve(?Model $subject, array $args), vytvorený z kontajnera; argumenty musia byť skaláry alebo ich zoznamy.✓
Recipients::merge(...$specs)Zjednotenie.ak sú všetky časti
fn (Contract $c) => Recipients::role($c->company, 'manager')Closure vyhodnotená so subjektom.✗ — len v pravidlách pripomienok definovaných v kóde

Uložiteľné špecifikácie prežijú v riadku pripomienky, v eskalácii aj v rozposielaní cez front; uloženie closure vyhodí UnstorableRecipientsException.

Vlastný resolver

use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Notifications\Contracts\RecipientResolver;

final class OnCallResolver implements RecipientResolver
{
    public function __construct(private Rota $rota) {}   // resolved from the container

    public function resolve(?Model $subject, array $args): iterable
    {
        return $this->rota->onCall(level: $args['level'] ?? 1);
    }
}

Group resolver a recept pre teams

Predvolený ContractGroupResolver vyžaduje, aby skupina implementovala ProvidesNotificationRecipients; čokoľvek iné vyhodí UnresolvableRecipientsException s názvom triedy skupiny. Vlastný ResolvesGroupMembers naviažete cez notifications.recipients.group_resolver — s teams-for-laravel (odporúčané, nie povinné):

use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Notifications\Contracts\ResolvesGroupMembers;
use RoundlyConsulting\Teams\Facades\Teams;
use RoundlyConsulting\Teams\Models\Member;

final class TeamsGroupResolver implements ResolvesGroupMembers
{
    public function members(Model $group, ?string $role = null): iterable
    {
        return Teams::for($group)->members()->all()
            ->reject->isExpired()                     // all() includes expired memberships
            ->filter(fn (Member $member): bool => $role === null || $member->role === $role)
            ->map->member;
    }
}

// config/notifications.php
'recipients' => ['group_resolver' => App\Notifications\TeamsGroupResolver::class],

Kontroly prístupu

  • Druh bez subject() a odoslanie bez subjektu: vždy povolené.
  • Inak canAccess($recipient, $subject); predvolene sa pýta Gate oprávnenia notifications.access.ability (view) na subjekte pre príjemcu.
  • Prísne a nahlas: ak sa použije predvolená kontrola a subjekt nemá policy ani oprávnenie, odoslanie vyhodí MissingAccessCheckException s kľúčom druhu a názvom triedy subjektu. Ak to nechcete, prepíšte canAccess() (alebo ->access() pri fluentnom druhu).
  • Beží pri každom kroku, vždy s čerstvým subjektom (soft-deleted sa ráta ako neexistujúci, ak nie je allowsTrashedSubject()): pri odoslaní, v každej úlohe rozposielania, pri doručení e-mailu (z frontu, na konci okna, podržaného), pri každej položke súhrnu, pri každej pripomienke a eskalácii, v interop listeneri a pri uvoľnení podržaného interop e-mailu. Príjemca, ktorý prístup stratil, nedostane nič.
// The default check — the Gate ability notifications.access.ability ('view') on the subject:
Gate::forUser($recipient)->inspect('view', $subject)->allowed();

// Your own, on a class type…
public function canAccess(Model $recipient, ?Model $subject): bool
{
    return $subject?->company->users()->whereKey($recipient->getKey())->exists() ?? true;
}

// …or a fluent one
Notifications::define('announcement.posted')->subject(Announcement::class)->access(fn ($recipient, $subject): bool => true);

Odobratie prístupu

Čítanie schránky sa predvolene znova neoveruje — schránka ukazuje, čo bolo doručené. Keď prístup odoberiete, zavolajte revoke:

// Someone left the company: remove their items about this request and cancel their pending mail
Notifications::for($request)->revoke($formerMember);

// For everyone — also cancels the subject's pending reminders and escalations
Notifications::for($request)->revoke();

Alebo zapnite notifications.inbox.recheck_on_read, ktoré skryje neprístupné položky po stránkach (počty zostávajú surové).

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.