---
title: "Príjemcovia a prístup — Notifications for Laravel | Roundly"
description: "Recipients::users, role, members, owner, using a merge, group resolver a recept pre teams, prísne kontroly prístupu a revoke()."
url: https://roundly-consulting.com/sk/open-source/navody/notifications-for-laravel/prijemcovia-a-pristup
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Notifications for Laravel](https://roundly-consulting.com/sk/open-source/navody/notifications-for-laravel.md)

# Príjemcovia a prístup

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

```php
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

```php
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é):

```php
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č.

```php
// 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:

```php
// 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/notifications-for-laravel.md)
