Fasáda Attributes
Odporúčaným vstupným bodom je RoundlyConsulting\Attributes\Facades\Attributes. Attributes::for($owner) vráti handle atribútov daného vlastníka — všetky čítania aj zápisy na jednom mieste:
use RoundlyConsulting\Attributes\Facades\Attributes;
// Writes (validated against definitions, recorded in history, events fired)
Attributes::for($product)->set('color', 'red', meta: ['hex' => '#f00']); // Attribute
Attributes::for($product)->set('color', 'blue'); // new value, meta kept
Attributes::for($product)->setMany(['color' => 'red', 'size' => 'L']); // Collection<Attribute>, keeps others
Attributes::for($product)->sync(['color' => 'red'], forceDelete: false); // exactly this set
Attributes::for($product)->forget(['color'], forceDelete: false); // int removed ('color' works too)
Attributes::for($product)->forgetExcept(['color']); // list<string> removed
Attributes::for($product)->meta('color', ['hex' => '#ff0000']); // replace one attribute's meta (null clears)
Attributes::for($product)->stage()->set('color', 'red')->meta('color', ['hex' => '#f00'])->save(); // or ->sync()
// Reads
Attributes::for($product)->all(); // Collection<name, value>
Attributes::for($product)->toKeyValue(); // array<name, value>
Attributes::for($product)->keys(); // list<string>
Attributes::for($product)->get('color'); // value (or the defined default)
Attributes::for($product)->has('color'); // bool
Attributes::for($product)->history('color'); // Collection<AttributeRevision>, newest first
// Housekeeping
Attributes::prune(30); // force-delete attributes trashed more than 30 days ago (default: config)Zápisy sa overia voči definíciám, pri zapnutej histórii sa zaznamenajú a spúšťajú udalosti. setMany() a sync() prijímajú ako posledný argument voliteľnú mapu metadát podľa názvu (meta: ['color' => ['hex' => '#f00']]). Zápis hodnoty uložené metadáta atribútu ponechá, pokiaľ neodovzdáte nové; meta() ich nahradí a prejde prísnym režimom, históriou aj udalosťou AttributeAttached ako každý iný zápis.
Zápisy platia celé alebo vôbec: setMany(), sync() a stage()->save() overia každú hodnotu ešte pred prvým zápisom a bežia v jednej databázovej transakcii, takže neplatná hodnota či zlyhaný zápis nechá vlastníka presne v pôvodnom stave — nič sa neodpojí, nič sa nezapíše len napoly.
Handle vlastníka
Attributes::for($owner) vráti handle OwnerAttributes. Názvy sú vždy obmedzené na tohto vlastníka:
| Metóda | Vracia | Čo robí |
|---|---|---|
set($name, $value = null, $meta = null) | Attribute | Pripojí alebo aktualizuje jeden atribút; meta je pole alebo Collection — bez nej uložené metadáta zostanú. |
setMany(array $attributes, array $meta = []) | Collection<int, Attribute> | Pripojí alebo aktualizuje viacero, všetko alebo nič; ostatné atribúty zostanú. |
sync(array $attributes, bool $forceDelete = false, array $meta = []) | Collection<int, Attribute> | Nastaví atribúty presne na túto množinu, všetko alebo nič. |
forget(array|string $names, bool $forceDelete = false) | int | Odstráni atribúty; vráti ich počet. |
forgetExcept(array $keep, bool $forceDelete = false) | list<string> | Odstráni všetky neponechané atribúty; vráti odstránené názvy. |
meta($name, $meta) | Attribute | Nahradí metadáta jedného atribútu (null ich vymaže) — cez prísny režim, históriu aj udalosti. |
stage() | AttributeWriter | Fluentný builder; save() → setMany(), sync() → sync(). |
all() / toKeyValue() / keys() | Collection / array / list<string> | Všetky uložené atribúty vlastníka. |
get($name) / has($name) | mixed / bool | Jedna typovaná hodnota (s predvolenou) / prítomnosť. |
history(?string $name = null) | Collection<int, AttributeRevision> | Zaznamenané revízie, najnovšie prvé. |
Metódy fasády
Metódy pre definície a validáciu delegujú na singleton AttributeRegistry — pozrite Definície a validácia:
| Metóda | Vracia | Čo robí |
|---|---|---|
for(Model $owner) | OwnerAttributes | Handle vlastníka — všetky čítania a zápisy pre jeden model. |
prune(?int $days = null) | int | Natrvalo vymaže atribúty zmazané pred viac ako $days dňami (predvolene prune_after_days). |
define($definition) / defineMany(...$definitions) | AttributesManager | Zaregistruje globálne definície (reťaziteľné). |
has($name) / get($name) / all() | bool / ?AttributeDefinitionData / array | Čítanie globálnych definícií. |
forget($name) / flush() | AttributesManager | Odstráni jednu alebo všetky globálne definície — nie uložené hodnoty. |
resolveFor(?$owner, $name) / definitionsFor($owner) | definition(s) | Definície podľa vlastníka — schéma modelu nad globálnou. |
default($name, ?$owner = null) | mixed | Deklarovaná predvolená hodnota definície. |
requiredNames() | list<string> | Názvy povinných globálnych definícií. |
validate($name, $value) / validateFor(?$owner, $name, $value) | void | Vyhodí InvalidAttributeValueException. |
assertUnique($owner, $name, $value) | void | Vyhodí DuplicateAttributeValueException. |
isStrict() / assertKnown($name, ?$owner = null) | bool / void | Prísny režim; assertKnown() vyhodí UnknownAttributeException (schéma modelu vlastníka sa počíta ako registrácia). |
fake() | AttributesFake | Iba na fasáde — zaznamenávajúci fake (pozrite Testovanie). |
Metódy modelu sú skratky
Trait HasAttributes ponecháva krátke metódy na modeli — attachAttribute(), syncAttributes(), $product->attributes() a ďalšie — pre tie isté operácie. Každá deleguje na Attributes::for($this), takže sa správa rovnako a Attributes::fake() ju zaznamená. Čítanie podľa typu (attr(), attributeInt() …) a query scopy sú len na modeli.
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.