---
title: "DI a akcie — Connections for Laravel | Roundly"
description: "Namiesto fasády injektujte ConnectionManager alebo spúšťajte jednoúčelové akcie — s kompletnou mapou fasáda → akcia, DTO a výnimkami."
url: https://roundly-consulting.com/sk/open-source/navody/connections-for-laravel/akcie
language: sk
---

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

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

# DI a akcie

Fasáda je odporúčaná voľba, nie jediná cesta. Tri rovnocenné vstupné body spúšťajú rovnaký kód:

- Fasáda Connections — najkratší zápis, ktorý používa celá táto dokumentácia.
- Manažér RoundlyConsulting\\Connections\\ConnectionManager — koreň fasády, singleton v kontajneri, injektovaný cez konštruktor. Rovnaké API, explicitná závislosť a žiadne statické volania.
- Akcie — jednoúčelové triedy s metódou execute(), ktoré zapojíte do vlastných akcií, jobov a príkazov.

## Injektovanie manažéra alebo volanie akcie

```php
use RoundlyConsulting\Connections\Actions\GrantPermissions;
use RoundlyConsulting\Connections\ConnectionManager;

final class ShareTeam
{
    public function __construct(private ConnectionManager $connections) {}

    public function __invoke(User $user, Team $team): void
    {
        $this->connections->between($user, $team)->permissions()->grant('view');
    }
}

// The raw action.
app(GrantPermissions::class)->execute($user, $team, 'view');
```

Connections::fake() vymení okrem fasády aj väzbu v kontajneri, takže v testoch sa zaznamená aj injektovaný ConnectionManager a každý zápis cez trait HasConnections. Akcia, ktorú si sami získate a zavoláte, prebehne normálne, ale nezaznamená sa.

## Metóda fasády → akcia

| Metóda fasády | Akcia |
| --- | --- |
| `between()->connect() · invite()` | `CreateConnection (execute / executeData)` |
| `between()->accept()` | `AcceptConnection` |
| `between()->block()` | `BlockConnection` |
| `between()->disconnect()` | `DisconnectConnection` |
| `between()->reconnect() · restore()` | `RestoreConnection` |
| `between()->extend()` | `ExtendConnection` |
| `between()->permissions()->grant()` | `GrantPermissions` |
| `between()->permissions()->revoke()` | `RevokePermissions` |
| `between()->permissions()->sync()` | `SyncPermissions` |
| `between()->permissions()->clear()` | `ClearPermissions` |
| `from()->toMany()->connectAll()` | `BulkConnect` |
| `from()->toMany()->disconnectAll()` | `BulkDisconnect` |
| `from()->toMany()->grantAll() · revokeAll()` | `GrantPermissions · RevokePermissions (per target)` |
| `from()->sync()` | `SyncConnections` |
| `Connections::prune()` | `PruneConnections` |

exists(), find(), toggle(), expiring(), flushCache() a čítanie oprávnení (all(), has(), hasAny(), hasAll()) vlastnú akciu nemajú: ide o dopyty, údržbu cache alebo — pri toggle() — o connect() či disconnect() zvolené v čase volania.

## Priame volanie akcií

Operáciu spustíte priamo tak, že akciu získate z kontajnera:

```php
use RoundlyConsulting\Connections\Actions\CreateConnection;
use RoundlyConsulting\Connections\Actions\GrantPermissions;
use RoundlyConsulting\Connections\Actions\RevokePermissions;
use RoundlyConsulting\Connections\Actions\SyncPermissions;
use RoundlyConsulting\Connections\Actions\ClearPermissions;
use RoundlyConsulting\Connections\Actions\ExtendConnection;
use RoundlyConsulting\Connections\Actions\DisconnectConnection;
use RoundlyConsulting\Connections\Actions\PruneConnections;
use RoundlyConsulting\Connections\Actions\SyncConnections;
use RoundlyConsulting\Connections\DataTransferObjects\SyncTarget;

app(CreateConnection::class)->execute($user, $team, collect(['view']), now()->addMonth());
app(GrantPermissions::class)->execute($user, $team, 'publish');
app(RevokePermissions::class)->execute($user, $team, 'publish');
app(SyncPermissions::class)->execute($user, $team, 'view', 'edit');
app(ClearPermissions::class)->execute($user, $team);
app(ExtendConnection::class)->execute($user, $team, now()->addYear());
app(DisconnectConnection::class)->execute($user, $team);
app(PruneConnections::class)->execute();
app(SyncConnections::class)->execute($user, [new SyncTarget($team)]);
```

grant a sync chýbajúce prepojenie vytvoria. disconnect, revoke, clear a extend vyhodia ConnectionNotFound, ak prepojenie neexistuje. CreateConnection::execute() prijíma oba modely a voliteľne oprávnenia, expiráciu, stav, meta a príznak nahradenia meta; executeData() prijíma ten istý vstup ako DTO ConnectionData. Riadi sa pravidlami opätovného prepojenia — argument null pri existujúcom prepojení ponechá uloženú hodnotu — a explicitný stav, do ktorého prejsť nemôže (pozrite canTransitionTo(), a nikdy nie zo stavu blocked), vyhodí InvalidStatusTransition:

```php
use RoundlyConsulting\Connections\Actions\CreateConnection;
use RoundlyConsulting\Connections\Enums\ConnectionStatus;

app(CreateConnection::class)->execute(
    $user,
    $team,
    collect(['view']),            // ?Collection — null: default_permissions when new, kept when existing
    now()->addMonth(),            // ?CarbonInterface — null: expiry.default when new, kept when existing
    ConnectionStatus::Pending,    // ?ConnectionStatus — null: default_status when new, kept when existing
    ['source' => 'import'],       // ?array meta — null keeps the stored meta
    replaceMeta: false,           // true overwrites the stored meta instead of merging
);
```

## Akcie pre stav, obnovu, hromadné operácie a sync

```php
use RoundlyConsulting\Connections\Actions\AcceptConnection;
use RoundlyConsulting\Connections\Actions\BlockConnection;
use RoundlyConsulting\Connections\Actions\RestoreConnection;
use RoundlyConsulting\Connections\Actions\BulkConnect;
use RoundlyConsulting\Connections\Actions\BulkDisconnect;
use RoundlyConsulting\Connections\Actions\SyncConnections;
use RoundlyConsulting\Connections\DataTransferObjects\SyncTarget;

app(AcceptConnection::class)->execute($user, $team);                       // Connection
app(BlockConnection::class)->execute($user, $team);                        // Connection
app(RestoreConnection::class)->execute($user, $team);                      // Connection
app(BulkConnect::class)->execute($user, [$teamA, $teamB], collect(['view'])); // Collection<Connection>
app(BulkDisconnect::class)->execute($user, [$teamA, $teamB]);              // void
app(SyncConnections::class)->execute($user, [new SyncTarget($teamA, ['view'])]); // SyncResult
```

| Akcia | Správanie |
| --- | --- |
| `CreateConnection` | Vytvorí dvojicu alebo zmení len zadané; oživí soft-deleted dvojicu. Spustí ConnectionCreated (+ ConnectionInvited pri stave pending), ConnectionUpdated, pri zablokovanej dvojici ConnectionRestored. Vyhodí InvalidStatusTransition. |
| `DisconnectConnection` | Soft delete; spustí ConnectionRemoved. Vyhodí ConnectionNotFound. |
| `GrantPermissions` | Pridá oprávnenia; chýbajúce prepojenie vytvorí. |
| `RevokePermissions` | Odoberie oprávnenia. Vyhodí ConnectionNotFound. |
| `SyncPermissions` | Nahradí sadu; chýbajúce prepojenie vytvorí. |
| `ClearPermissions` | Vyprázdni sadu; prepojenie nikdy nevytvorí. Vyhodí ConnectionNotFound. |
| `ExtendConnection` | Nastaví alebo zruší expires\_at; spustí ConnectionUpdated. Vyhodí ConnectionNotFound. |
| `PruneConnections` | Soft-delete všetkých expirovaných prepojení a vyprázdnenie cache; vráti ich počet. |
| `AcceptConnection / BlockConnection` | Zmení stav (bez zmeny nič nerobí); AcceptConnection jediná výslovne zruší blokovanie. Vyhodí ConnectionNotFound. |
| `RestoreConnection` | Obnoví zmazaný riadok v pôvodnej podobe (ConnectionRestored) alebo vytvorí nový. |
| `BulkConnect / BulkDisconnect` | Spustí CreateConnection / DisconnectConnection nad zoznamom v jednej transakcii na databáze modelu prepojenia. BulkConnect prijíma aj voliteľný posledný príznak replaceMeta. |
| `SyncConnections` | Zosúladí so zoznamom SyncTarget v jednej transakcii a oživí odpojené ciele; vráti SyncResult. |

## Data transfer objekty

ConnectionData prenáša kompletný zápis prepojenia do CreateConnection::executeData(); jeho príznak mergePermissions (predvolene false) zariadi, že zápis do živého riadku dvojice oprávnenia k uloženej sade pridá namiesto toho, aby ju nahradil. PermissionSet je nemenný zoznam oprávnení bez duplicít, s ktorým akcie pracujú. SyncTarget a SyncResult opisuje sekcia Hromadné operácie a sync.

```php
use RoundlyConsulting\Connections\Actions\CreateConnection;
use RoundlyConsulting\Connections\DataTransferObjects\ConnectionData;
use RoundlyConsulting\Connections\DataTransferObjects\PermissionSet;
use RoundlyConsulting\Connections\Enums\ConnectionStatus;

$data = ConnectionData::fromModels(
    $user,
    $team,
    permissions: PermissionSet::make('view', 'edit'),
    expiresAt: now()->addMonth(),
    status: ConnectionStatus::Pending,
    meta: ['source' => 'import'],
    mergePermissions: true,   // on a live row, add to the stored permissions instead of replacing them
);

app(CreateConnection::class)->executeData($data, $user, $team);

$set = PermissionSet::make('view')->add('edit', 'view')->remove('view');
$set->all();          // ['edit'] — always de-duplicated
$set->has('edit');    // true
$set->isEmpty();      // false
$set->toCollection(); // Collection<int, string>
```

## Výnimky

| Výnimka | Kedy nastane |
| --- | --- |
| `ConnectionsException` | Abstraktný základ výnimiek balíka — zachytí všetky tri nižšie. |
| `ConnectionNotFound` | disconnect, revoke, clear, extend, accept alebo block nad dvojicou bez prepojenia. |
| `InvalidStatusTransition` | Zmena stavu, ktorú canTransitionTo() nepovolí, alebo pokus o zrušenie blokovania cez prepájacie sloveso — napríklad invite() nad prijatým či zablokovaným prepojením. |
| `MissingConnectable` | Terminálne sloveso bez connectable alebo hromadné sloveso bez cieľov z toMany(). |

## 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/connections-for-laravel.md)
