Vnorené tímy
Pre hierarchie ako firma → oddelenie → tím. Vnáranie je predvolene vypnuté — nastavte TEAMS_NESTING=true po spustení migrácie parent_id (pozrite Inštalácia); kým je vypnuté, stĺpec nič nečíta. Členstvo zostáva viazané na konkrétny tím:
use RoundlyConsulting\Teams\Facades\Teams;
// .env → TEAMS_NESTING=true (after the parent_id migration ran)
Teams::for($department)->moveUnder($company); // Team — place under a parent
Teams::for($department)->moveToRoot(); // Team — detach
$department->parent; // ?Team
$company->children; // Collection<Team>
$team->ancestors(); // nearest first; stops at a soft-deleted ancestor
$company->descendants(); // level by level
$team->root(); // the topmost ancestor, or the team itself
$team->depth(); // 0 for a root teammoveUnder() a moveToRoot() spustia MoveTeamAction, ktorá na čas transakcie zamkne oba riadky, uloží zmenu a spustí TeamMoved s tímom, novým rodičom a kľúčom predchádzajúceho rodiča; Teams::fake() ju zaznamená. Každá zmena rodiča sa overí pri uložení — cez akciu aj cez priame $team->update(['parent_id' => …]) — a vyhodí TeamHierarchyException, ak je vnáranie vypnuté, ak je nový rodič samotný tím alebo jeho potomok (aj mäkko zmazaný), alebo ak by sa niektorý tím presúvaného podstromu dostal hlbšie ako nesting.max_depth (predvolene 4, 1 – 100; koreň má hĺbku 0). Odpojenie je povolené vždy.
Tím, ktorý má ešte podriadené tímy, natrvalo zmazať nejde — najprv ich presuňte alebo zmažte. Mäkké zmazanie rodiča väzbu ponechá, no zastaví ancestors() aj dedenie rolí, pretože zmazaný tím neudeľuje nič. Každé prechádzanie je ohraničené max_depth a pamätá si navštívené riadky, takže ani dáta, ktoré surový dopyt zacyklil, ho nezaseknú.
Roly sa dedia smerom nadol
S TEAMS_INHERIT_ROLES_DOWN=true — účinné len pri zapnutom vnáraní — platí rola v tíme aj vo všetkých tímoch pod ním, nikdy nad ním:
- Dedí sa — memberHasPermission() a hasTeamPermission(), vyhodnotené voči sade rolí tímu, v ktorom je rola držaná; memberHasRole(), hasTeamRole() a @teamRole; ability teams.<oprávnenie> v Gate, @teamPermission a tímové policies; isAccessibleBy(), a teda middleware teams.context, switchTo(), setCurrentMany() a opätovné overenie pri jobe vo fronte; pri moste k permissions aj priradenia v nadradenom tíme.
- Nededí sa — hasActiveMember(), hasMember(), findMember(), isActiveMemberOf(), teamRole(), belongsToTeam() a isMemberOf(): členstvo zostáva viazané na tím. Aj vlastníctvo — isOwnedBy(), teams.owner, @teamOwner a before() v policy — patrí konkrétnemu tímu, hoci oprávnenia roly owner vlastníka nadradeného tímu sa dedia.
- Expirované členstvá a tie, ktoré ešte nezačali, sa nepočítajú na žiadnej úrovni.
Dáta viazané na tím zvyčajne ukazujú na koreňový tím:
// Team-scoped data usually points at the root team:
Teams::switchTo($team->root());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.