NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

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'));  // action

Injektovanie 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:

Akciaexecute(…)VraciaCesta cez fasádu
Tagging\AttachTagsActionexecute($taggable, TagSelection $selection)TagChangesTags::attach(), for()->attach(), attachTags()
Tagging\DetachTagsActionexecute($taggable, TagSelection $selection)TagChangesTags::detach(), for()->detach(), detachTags()
Tagging\SyncTagsActionexecute($taggable, TagSelection $selection)TagChangesTags::sync(), for()->sync(), syncTags()
Tagging\ClearTagsActionexecute($taggable, $type = null)TagChangesTags::clear(), for()->clear(), clearTags()
Catalog\CreateTagActionexecute($type, TagData $data, ?Model $scope = null)Tagtype()->create(), make()->create()
Catalog\FindOrCreateTagActionexecute($type, string|array|TagData $name, ?Model $scope = null)Tagtype()->findOrCreate(), make()->findOrCreate()
Catalog\UpdateTagActionexecute(Tag $tag, UpdateTagData $data)Tagtype()->update(), rename(), edit()->save()
Catalog\MoveTagActionexecute(Tag $tag, ?Tag $under = null, ?int $position = null)Tagtype()->move()
Catalog\ReorderTagsActionexecute($type, ?Model $scope, ?Tag $parent, array $order)Collection<int, Tag>type()->reorder()
Catalog\DeleteTagActionexecute(Tag $tag, TagChildren $children = Refuse)Tagtype()->delete()
Catalog\RestoreTagActionexecute(Tag $tag)Tagtype()->restore()
Maintenance\RepairTagsActionexecute(RepairOptions $options)RepairReportTags::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 kryptomien

Odoslaní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.