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

Pozvánky a stavy

Každé prepojenie má stav — pending, accepted alebo blocked. connect() predvolene vytvára prijaté prepojenia; invite() vytvorí prepojenie v stave pending, ktoré prijímajúca strana prijme alebo zablokuje:

// Connector side: send an invitation (a pending connection).
Connections::between($user, $team)->withPermissions('view')->invite();

// Receiving side accepts or blocks.
$team->acceptConnectionFrom($user);  // status → accepted (now active)
$team->blockConnectionFrom($user);   // status → blocked (grants nothing)

// Or drive it from the connector / builder.
Connections::between($user, $team)->accept();
Connections::between($user, $team)->block();
$user->inviteConnection($team);

// Model helpers.
$connection->isPending();
$connection->isAccepted();
$connection->isBlocked();
$connection->isActive();   // accepted AND not expired

Kým je zapnuté enforce_active_on_check (predvolene áno), oprávnenia udeľujú a do isConnectedTo() sa započítavajú len aktívne prepojenia — prijaté a neexpirované. Otvorená pozvánka ani zablokované prepojenie neudelia nič.

  • acceptConnectionFrom() a blockConnectionFrom() voláte na prijímajúcej strane a ako argument odovzdáte connector.
  • accept() a block() vyhodia ConnectionNotFound, ak dvojica prepojenie nemá.
  • Ak už prepojenie v danom stave je, nič sa nestane a event sa nespustí; inak sa spustí ConnectionAccepted alebo ConnectionBlocked.
  • Blokovanie zruší jedine výslovné accept() — na prijímajúcej strane acceptConnectionFrom().
  • Vytvorenie prepojenia v stave pending spustí ConnectionCreated a po ňom ConnectionInvited.

Prechody stavov sa vynucujú

Stav sa mení len tak, ako dovolí ConnectionStatus::canTransitionTo(), a vynucuje to každá akcia:

  • connect(), toggle(), connectAll() a sync() stav existujúceho prepojenia nikdy nezmenia — opätovné prepojenie neprijme otvorenú pozvánku samo, neznehodnotí prijaté prepojenie ani nezruší blokovanie.
  • invite() nad otvorenou pozvánkou je v poriadku; nad prijatým či zablokovaným prepojením vyhodí RoundlyConsulting\Connections\Exceptions\InvalidStatusTransition.
  • Blokovanie zruší jedine výslovné accept(). Prežije aj disconnect() a connections:prune: opätovné prepojenie soft-deleted zablokovanej dvojice ju obnoví stále zablokovanú a spustí ConnectionRestored.
// Re-connecting never changes an existing connection's status.
Connections::between($user, $team)->invite();    // pending
Connections::between($user, $team)->connect();   // still pending — no self-accept
Connections::between($user, $team)->invite();    // fine — re-inviting a pending invitation

$team->acceptConnectionFrom($user);              // accepted
Connections::between($user, $team)->invite();    // throws InvalidStatusTransition

// Only an explicit accept() lifts a block — it even survives disconnect() and a prune.
$team->blockConnectionFrom($user);
Connections::between($user, $team)->disconnect();
Connections::between($user, $team)->connect();   // restored still blocked (ConnectionRestored)
$team->acceptConnectionFrom($user);              // accepted — the block is lifted

Pozvánky ako predvolený stav

Nastavte default_status na pending a každé nové prepojenie bude pozvánkou — connect() potom vytvára prepojenia v stave pending a pre každé spustí ConnectionInvited. Pre jedno volanie pripraví stav pending metóda asPending():

// config/connections.php — every new connection starts as an invitation
'default_status' => 'pending',

// Or for a single call: asPending() stages the pending state.
Connections::between($user, $team)->asPending()->withPermissions('view')->connect();
// same as ->invite()

Enum ConnectionStatus

Stĺpec status sa castuje na reťazcový enum Enums\ConnectionStatus. Jeho kontrola canTransitionTo() povoľuje prijatie zo stavu pending aj blocked (accept() nad zablokovaným prepojením je výslovné zrušenie blokovania), blokovanie z ľubovoľného stavu, návrat do pending nikdy a prechod do aktuálneho stavu vždy. Vynucuje ju každá akcia a prepájacie slovesá sú ešte prísnejšie — blokovanie nikdy nezrušia. Využite ju aj vo vlastnom UI a validácii:

use RoundlyConsulting\Connections\Enums\ConnectionStatus;

$connection->status;   // ConnectionStatus::Accepted (cast from the status column)

ConnectionStatus::Pending->canTransitionTo(ConnectionStatus::Accepted);   // true
ConnectionStatus::Blocked->canTransitionTo(ConnectionStatus::Accepted);   // true — accept() is the explicit unblock
ConnectionStatus::Accepted->canTransitionTo(ConnectionStatus::Blocked);   // true — blocking is always allowed
ConnectionStatus::Accepted->canTransitionTo(ConnectionStatus::Pending);   // false

Enum používa zdieľaný trait Helpers z enums-for-laravel, takže ponúka aj popisky, možnosti pre select a validačné pravidlo:

use RoundlyConsulting\Connections\Enums\ConnectionStatus;

ConnectionStatus::values();          // Collection: ['pending', 'accepted', 'blocked']
ConnectionStatus::labels();          // Collection: ['Pending', 'Accepted', 'Blocked']
ConnectionStatus::toOptions();       // Collection: ['pending' => 'Pending', ...] for <select>
ConnectionStatus::toArray();         // array: the plain-array form of toOptions()
ConnectionStatus::options();         // Collection<EnumOption> for JS/Inertia selects
ConnectionStatus::validationRule();  // 'in:pending,accepted,blocked'
ConnectionStatus::Accepted->readable();       // 'Accepted'
ConnectionStatus::tryFromLabel('Accepted');   // ConnectionStatus::Accepted

$request->validate([
    'status' => ['required', ConnectionStatus::validationRule()],
]);

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.