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 expiredKý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 liftedPozvá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); // falseEnum 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 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.