Štítky tenantov
Štítok je globálny alebo patrí jednému modelu rozsahu — tímu, tenantovi, projektu. Model so štítkami určí svoj rozsah cez tagScope(); potom vidí štítky svojho rozsahu aj globálne a voľný názov napísaný na ňom sa vytvorí v jeho rozsahu:
// Free-form tags typed on a task belong to its team (Task::tagScope() returns $this->team)
$task->attachTags('printer', 'label'); // the team's "printer", else the global one, else a new team tag
// Catalog handles: reads see the scope's tags plus the global ones…
$labels = Tags::type('label')->within($team);
$labels->all();
$labels->suggest('pri');
// …or only the scope's
Tags::type('label')->within($team, includeGlobal: false)->all();
// Writes match the handle's scope exactly
$labels->make('Urgent')->create(); // a team tag
Tags::type('label')->make('Urgent')->create(); // a global tag, for every team
$labels->delete($globalTag); // TagScopeMismatchException — never touches a global tag
// A tag of another scope is refused on a model, exactly like a missing one
$task->attachTags($tagOfAnotherTeam, 'label'); // TagScopeMismatchException (code tag_not_found)- Reťazec sa vyhodnotí najprv v rozsahu modelu, potom globálne. Rovnaký názov môže existovať ako štítok tímu aj ako globálny štítok; pre modely tímu vyhrá štítok tímu.
- Unikátnosť platí pre typ a rozsah, takže dva tímy môžu mať každý vlastné označenie printer.
- Zápisy cez handle katalógu presne zodpovedajú jeho rozsahu: handle within($team) upravuje, presúva a maže len štítky tímu a nikdy globálny štítok, ktorý vidia všetci tenanti; handle bez rozsahu zapisuje len globálne štítky. Štítok iného rozsahu vyhodí TagScopeMismatchException.
- Štítok či kľúč iného rozsahu odpovie presne ako chýbajúci — v každej metóde, v TagsRule aj v API — takže žiadna odpoveď neodlíši cudzí štítok od neexistujúceho.
- Model rozsahu musí byť uložený a mať kľúč typu tags.key_type. Jeho interný kľúč rozsahu tvorí morph trieda a kľúč s najviac 300 znakmi — pre dlhý názov triedy zaregistrujte krátky morph alias.
Typy len globálne
Niektoré druhy štítkov majú byť jedným zoznamom pre všetkých — krajina, hlavná kategória:
Tags::define('country')->globalOnly(); // one shared list for every tenant
$venue->attachTags('Austria', 'country'); // looked up and created globally, tagScope() ignored
Tags::type('country')->within($team)->make('Austria')->create(); // InvalidTagException: always globalDotazy s rozsahom
// Strings resolve in every scope of the type, unless within: narrows them to a scope plus global
Task::withAnyTags(['printer'], 'label', within: $team)->get();
Tag::query()->ofType('label')->within($team)->get(); // the team's tags and the global ones
Tag::query()->ofType('label')->within($team, false)->get(); // the team's only
Tag::query()->ofType('label')->global()->get(); // global onlyV query scopes reťazce zodpovedajú pomenovanému štítku vo všetkých rozsahoch typu — v každom rozsahu podľa jeho prvého zhodného jazyka reťaze —, pokiaľ ich within: nezúži — modely totiž zužuje už váš vlastný dotaz. Modely a kľúče štítkov zodpovedajú presne tým štítkom, ktorými sú.
Keď sa rozsah modelu zmení
Priradenia si ponechajú štítky, na ktoré ukazujú. Model, ktorému sa tagScope() zmení, si štítky starého rozsahu ponechá, kým ich najbližší sync daného typu neodstráni; tags:doctor takéto priradenia spočíta ako upozornenie.
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.