Hromadné operácie a sync
Cez toMany() pripravte viac connectables a spustite nad všetkými jedno hromadné sloveso:
use RoundlyConsulting\Connections\Facades\Connections;
// Touch many targets in one call (each still emits its own event).
Connections::from($user)->toMany([$teamA, $teamB])->withPermissions('view')->connectAll();
Connections::from($user)->toMany($teams)->disconnectAll();
Connections::from($user)->toMany($teams)->grantAll('publish');
Connections::from($user)->toMany($teams)->revokeAll('publish'); // any status: pending, blocked, expired- connectAll() beží v jednej databázovej transakcii a vráti prepojenia; každá položka ide bežnou cestou vytvárania, takže eventy aj invalidácia cache fungujú správne.
- disconnectAll() beží v jednej transakcii a connectables bez prepojenia preskočí.
- grantAll() chýbajúce prepojenia vytvorí, rovnako ako grant(); bez argumentov použije pripravené oprávnenia.
- revokeAll() odoberie oprávnenia každému cieľu s prepojením v ľubovoľnom stave — vrátane pending, blocked a expirovaných, takže odobraté oprávnenie sa po accept() či extend() nevráti. Ciele bez prepojenia alebo len so soft-deleted prepojením preskočí.
- toMany() prijme akýkoľvek iterable — pole aj Eloquent kolekciu. Hromadné sloveso bez toMany() vyhodí MissingConnectable.
Zosúladenie presnej množiny
Connections::from($user)->sync() — alebo syncConnections() z traitu — funguje ako sync() v Eloquente: prepojí chýbajúce, odpojí nadbytočné a aktualizuje prienik, všetko v jednej transakcii — pri chybe sa vráti celé zosúladenie. Pravidlá stavov platia rovnako ako pri connect(). Vracia SyncResult:
use RoundlyConsulting\Connections\DataTransferObjects\SyncTarget;
use RoundlyConsulting\Connections\Facades\Connections;
// Reconcile to exactly this set: connect missing, disconnect extras, update overlap.
// Safe to repeat — a target detached earlier is revived, not re-inserted.
$result = Connections::from($user)->sync([$teamA, $teamC]); // or $user->syncConnections([...])
$result->attached; // list of newly connected (or revived) ids
$result->detached; // list of disconnected ids
$result->updated; // list of ids that already existed
$result->isEmpty(); // true when nothing was attached, detached or updated
// Per-target permissions, expiry or meta through SyncTarget DTOs. On an overlap, only what the
// target states changes: a plain model (or a null field) keeps the stored value, and the
// status is never touched.
Connections::from($user)->sync([
new SyncTarget($teamA, permissions: ['view', 'edit']),
new SyncTarget($teamB, ['publish'], now()->addDays(30)),
]);Cieľom je samotný connectable alebo DTO SyncTarget — cez SyncTarget dáte jednému cieľu vlastné oprávnenia, expiráciu či meta:
use RoundlyConsulting\Connections\DataTransferObjects\SyncTarget;
new SyncTarget(
model: $teamB, // required — a Connectable
permissions: ['publish'], // optional
expiresAt: now()->addDays(30), // optional CarbonInterface
meta: ['source' => 'directory'], // optional
);Čo treba vedieť o sync
- Sync zosúlaďuje všetky prepojenia, ktoré connector vytvoril, naprieč všetkými typmi connectable — prepojenia na modely, ktoré v zozname chýbajú, sa odpoja bez ohľadu na ich triedu. Odovzdajte kompletnú želanú množinu.
- Pri prieniku sa zmení len to, čo cieľ uvádza: samotný model — alebo pole SyncTarget ponechané na null — zachová uložené oprávnenia, expiráciu aj meta a stav sa nikdy nemení.
- Odpojené prepojenia sa soft-deletujú a spustia ConnectionRemoved. Ak jedno neskôr znova zosynchronizujete, oživí sa ako nové prepojenie a objaví sa v attached, takže sync môžete bezpečne opakovať.
- Prázdny zoznam odpojí všetko, čo connector vytvoril.
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.