DI a akcie
Fasáda je odporúčaná predvolená voľba, nie jediná cesta. Ten istý kód spúšťajú tri vstupné body: fasáda Tags (najkratšia), manažér RoundlyConsulting\Tags\TagsManager — koreň fasády, singleton v kontajneri — injektovaný cez konštruktor (rovnaké API, explicitná závislosť, žiadne statické volania) a akcie (final readonly triedy s jedinou metódou execute(), ktoré skladáte do vlastných akcií, úloh a príkazov):
use RoundlyConsulting\Tags\Actions\Tagging\AttachTagsAction;
use RoundlyConsulting\Tags\DataTransferObjects\TagSelection;
use RoundlyConsulting\Tags\Facades\Tags;
use RoundlyConsulting\Tags\TagsManager;
Tags::for($concert)->attach(['live'], 'label'); // facade
app(TagsManager::class)->for($concert)->attach(['outdoor'], 'label'); // dependency injection
app(AttachTagsAction::class)->execute($concert, TagSelection::of(['free'], 'label')); // actionInjektovanie manažéra
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use RoundlyConsulting\Tags\TagsManager;
final class ConcertLabelsController
{
public function __construct(private TagsManager $tags) {}
public function update(Request $request, Concert $concert): Response
{
$this->tags->for($concert)->sync($request->input('labels', []), 'label');
return response()->noContent();
}
}Manažér nedrží vlastný kontajner: akcie a služby na čítanie si pri každom volaní vezme z aktuálneho, takže je bezpečný pre Octane a platí aj väzba vytvorená počas požiadavky.
Volanie akcie
use RoundlyConsulting\Tags\Actions\Catalog\DeleteTagAction;
use RoundlyConsulting\Tags\Actions\Maintenance\RepairTagsAction;
use RoundlyConsulting\Tags\Actions\Tagging\SyncTagsAction;
use RoundlyConsulting\Tags\DataTransferObjects\RepairOptions;
use RoundlyConsulting\Tags\DataTransferObjects\TagSelection;
use RoundlyConsulting\Tags\Enums\TagChildren;
app(SyncTagsAction::class)->execute($concert, TagSelection::of($jazz, 'genre'));
app(DeleteTagAction::class)->execute($jazz, TagChildren::Reparent);
app(RepairTagsAction::class)->execute(new RepairOptions(counts: true, paths: false, scopeKeys: false, orphans: false));Metóda fasády → akcia
Menné priestory sú relatívne k RoundlyConsulting\Tags\Actions:
| Akcia | execute(…) | Vracia | Cesta cez fasádu |
|---|---|---|---|
Tagging\AttachTagsAction | execute($taggable, TagSelection $selection) | TagChanges | Tags::attach(), for()->attach(), attachTags() |
Tagging\DetachTagsAction | execute($taggable, TagSelection $selection) | TagChanges | Tags::detach(), for()->detach(), detachTags() |
Tagging\SyncTagsAction | execute($taggable, TagSelection $selection) | TagChanges | Tags::sync(), for()->sync(), syncTags() |
Tagging\ClearTagsAction | execute($taggable, $type = null) | TagChanges | Tags::clear(), for()->clear(), clearTags() |
Catalog\CreateTagAction | execute($type, TagData $data, ?Model $scope = null) | Tag | type()->create(), make()->create() |
Catalog\FindOrCreateTagAction | execute($type, string|array|TagData $name, ?Model $scope = null) | Tag | type()->findOrCreate(), make()->findOrCreate() |
Catalog\UpdateTagAction | execute(Tag $tag, UpdateTagData $data) | Tag | type()->update(), rename(), edit()->save() |
Catalog\MoveTagAction | execute(Tag $tag, ?Tag $under = null, ?int $position = null) | Tag | type()->move() |
Catalog\ReorderTagsAction | execute($type, ?Model $scope, ?Tag $parent, array $order) | Collection<int, Tag> | type()->reorder() |
Catalog\DeleteTagAction | execute(Tag $tag, TagChildren $children = Refuse) | Tag | type()->delete() |
Catalog\RestoreTagAction | execute(Tag $tag) | Tag | type()->restore() |
Maintenance\RepairTagsAction | execute(RepairOptions $options) | RepairReport | Tags::repair(), tags:repair |
- Každý zápis — z fasády, injektovaného manažéra, handle, buildera či metódy modelu — prechádza manažérom, ktorý akciu vezme z kontajnera, takže vaša väzba akcie v kontajneri platí všade.
- Tags::fake() vymení manažéra aj v kontajneri, takže fake sa týka aj injektovaného TagsManager. Priame volanie akcie sa nezaznamená — zaznamenajú sa len volania manažéra.
- Kontroly rozsahu handle type() (zápis presne zodpovedá jeho rozsahu) sú v handle: akcia volaná priamo zapíše akýkoľvek štítok, ktorý jej odovzdáte.
- Služby na čítanie BuildTagTree, LoadAncestors, PopularTags a SuggestTags (RoundlyConsulting\Tags\Queries) sa tiež berú z kontajnera, takže môžete naviazať vlastné.
- Actions\Internal\* (AdjustUsageCountsAction, ApplyTagChangesAction, ClearDeletedTaggableAction, ResolveTagsAction, RewriteSubtreePathsAction) sú stavebné bloky — nevolajte ich.
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.