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());| Spec | Vyhodnotenie | Ulož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 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.