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
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:
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:
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
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. |
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(); PermissionSet je nemenný zoznam oprávnení bez duplicít, s ktorým akcie pracujú. SyncTarget a SyncResult opisuje sekcia Hromadné operácie a sync.
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'],
);
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 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.