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

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ádyAkcia
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
AkciaSprávanie
CreateConnectionVytvorí dvojicu alebo zmení len zadané; oživí soft-deleted dvojicu. Spustí ConnectionCreated (+ ConnectionInvited pri stave pending), ConnectionUpdated, pri zablokovanej dvojici ConnectionRestored. Vyhodí InvalidStatusTransition.
DisconnectConnectionSoft delete; spustí ConnectionRemoved. Vyhodí ConnectionNotFound.
GrantPermissionsPridá oprávnenia; chýbajúce prepojenie vytvorí.
RevokePermissionsOdoberie oprávnenia. Vyhodí ConnectionNotFound.
SyncPermissionsNahradí sadu; chýbajúce prepojenie vytvorí.
ClearPermissionsVyprázdni sadu; prepojenie nikdy nevytvorí. Vyhodí ConnectionNotFound.
ExtendConnectionNastaví alebo zruší expires_at; spustí ConnectionUpdated. Vyhodí ConnectionNotFound.
PruneConnectionsSoft-delete všetkých expirovaných prepojení a vyprázdnenie cache; vráti ich počet.
AcceptConnection / BlockConnectionZmení stav (bez zmeny nič nerobí); AcceptConnection jediná výslovne zruší blokovanie. Vyhodí ConnectionNotFound.
RestoreConnectionObnoví zmazaný riadok v pôvodnej podobe (ConnectionRestored) alebo vytvorí nový.
BulkConnect / BulkDisconnectSpustí CreateConnection / DisconnectConnection nad zoznamom v jednej transakcii.
SyncConnectionsZosú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ýnimkaKedy nastane
ConnectionsExceptionAbstraktný základ výnimiek balíka — zachytí všetky tri nižšie.
ConnectionNotFounddisconnect, revoke, clear, extend, accept alebo block nad dvojicou bez prepojenia.
InvalidStatusTransitionZmena 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.
MissingConnectableTerminá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

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.