DI a akcie
Fasáda je odporúčaná voľba, nie povinnosť. Máte tri rovnocenné vstupné body a všetky spúšťajú ten istý kód:
- Fasáda Attributes — najkratší zápis, vhodný pre väčšinu kódu.
- Manager RoundlyConsulting\Attributes\AttributesManager vložený cez konštruktor — je koreňom fasády, singletonom v kontajneri s presne rovnakým API, len ako explicitná závislosť bez statických volaní.
- Akcie — jednoúčelové final readonly triedy s jedinou metódou execute(), ktoré skladáte do vlastných akcií, jobov a príkazov.
Vloženie managera
use RoundlyConsulting\Attributes\AttributesManager;
final class ImportColor
{
public function __construct(private AttributesManager $attributes) {}
public function __invoke(Product $product, string $color): void
{
$this->attributes->for($product)->set('color', $color);
}
}Attributes::fake() vymení okrem fasády aj väzbu v kontajneri, takže sa zaznamená aj vložený AttributesManager.
Volanie akcie
use RoundlyConsulting\Attributes\Actions\AttachAttributeAction;
use RoundlyConsulting\Attributes\Actions\SyncAttributesAction;
use RoundlyConsulting\Attributes\DataTransferObjects\AttributeData;
// The raw actions — one execute() each
app(AttachAttributeAction::class)->execute($product, new AttributeData('color', 'red'));
$attributes = app(SyncAttributesAction::class)->execute($product, [
new AttributeData('color', 'red', collect(['hex' => '#f00'])),
new AttributeData('size', 'L'),
]); // Collection<int, Attribute>Akcie prijímajú DTO z RoundlyConsulting\Attributes\DataTransferObjects: AttributeData(name, value = null, ?Collection meta = null) pre hodnotu a AttributeDefinitionData pre definíciu. Priamo volaná akcia obchádza manager, preto ju fake nezaznamená.
Metóda fasády → akcia
| Cesta cez fasádu | Akcia | execute() |
|---|---|---|
for($o)->set() | AttachAttributeAction | (Model $owner, AttributeData $data): Attribute |
for($o)->setMany(), for($o)->stage()->save() | AttachAttributesAction | (Model $owner, AttributeData ...$data): Collection<int, Attribute> |
for($o)->sync(), for($o)->stage()->sync() | SyncAttributesAction | (Model $owner, list<AttributeData> $data, bool $forceDelete = false): Collection<int, Attribute> |
for($o)->forget() | DetachAttributesAction | (Model $owner, list<string> $names, bool $forceDelete = false): int |
for($o)->forgetExcept() | DetachAttributesExceptAction | (Model $owner, list<string> $keep, bool $forceDelete = false): list<string> |
for($o)->meta() | SyncAttributeMetaAction | (Model $owner, string $name, ?Collection $meta): Attribute |
prune() | PruneAttributesAction | (?int $days = null): int |
WriteAttributeAction (samotný upsert za každým pripojením, synchronizáciou a zápisom metadát) a RecordAttributeRevisionAction sú @internal — volajú ich akcie vyššie, preto ich sami nevolajte. Akcie na pripojenie, synchronizáciu a metadáta overujú pred zápisom a každá zapisovacia akcia beží v jednej transakcii — v savepointe, ak už transakcia beží. Metódy pre definície a validáciu akciu nemajú; sú v AttributeRegistry.
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.