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á voľba, nie jediná cesta. Rovnaký kód spúšťajú tri vstupy: fasáda Lifecycles (najkratší zápis), manažér RoundlyConsulting\Lifecycle\LifecycleManager — koreň fasády, singleton v kontajneri bez vlastného stavu — injektovaný cez konštruktor (rovnaké API, explicitná závislosť, žiadne statické volania) a akcie (jednoúčelové triedy s execute(), ktoré prijímajú request DTO a skladáte ich do vlastných akcií, jobov a príkazov).

Injektovanie manažéra

use RoundlyConsulting\Lifecycle\LifecycleManager;

final readonly class ReopenListing
{
    public function __construct(private LifecycleManager $lifecycle) {}

    public function __invoke(Listing $listing, User $user): void
    {
        $this->lifecycle->for($listing)->by($user)->because('Back in stock')->apply('reopen');
    }
}

Volanie akcie

use RoundlyConsulting\Lifecycle\Actions\ApplyTransitionAction;
use RoundlyConsulting\Lifecycle\DataTransferObjects\TransitionRequest;

// The raw use case
app(ApplyTransitionAction::class)->execute(new TransitionRequest(
    subject: $listing,
    lifecycle: 'status',
    transition: 'reopen',
    actor: $user,
    reason: 'Back in stock',
));

Metódy manažéra s request DTO

Každá kontrola a zmena z handlu prejde metódou manažéra, väčšina z nich prijíma request DTO — apply, attempt, check, available, rollback, checkRollback, freeze, unfreeze, schedule, cancelScheduled, changeExpiry, adopt, adoptAll, runDueSchedules, sendExpiryWarnings, retrySchedule, sweep, prune a allowDirectWrites. Čítania sú len na handli. Tieto metódy vystavuje aj fasáda:

use Carbon\CarbonInterval;
use RoundlyConsulting\Lifecycle\DataTransferObjects\ExpiryChangeRequest;
use RoundlyConsulting\Lifecycle\DataTransferObjects\PruneOptions;
use RoundlyConsulting\Lifecycle\DataTransferObjects\RollbackRequest;
use RoundlyConsulting\Lifecycle\Enums\ExpiryChange;
use RoundlyConsulting\Lifecycle\Facades\Lifecycles;

Lifecycles::rollback(new RollbackRequest($listing, 'status', toHistoryId: 42, actor: $user));
Lifecycles::checkRollback(new RollbackRequest($listing, 'status'));   // Decision
Lifecycles::changeExpiry(new ExpiryChangeRequest($listing, 'status', ExpiryChange::Extend, interval: CarbonInterval::days(7)));
Lifecycles::prune(new PruneOptions(historyOlderThanDays: 365, schedulesOlderThanDays: 30, dryRun: true));

Metóda handlu → manažér → akcia

Volanie handlu / fasádyMetóda manažéraAkcia
apply() / attempt() / transitionTo()apply(TransitionRequest) / attempt(TransitionRequest)ApplyTransitionAction
check() / can() / canTransitionTo() / checkTransitionTo()check(TransitionRequest)CheckTransitionAction
allowedTransitions() / allowedStates()available(AvailableTransitionsQuery)ListAvailableTransitionsAction
rollback() / rollbackTo()rollback(RollbackRequest)RollbackAction
canRollback() / canRollbackTo()checkRollback(RollbackRequest)CheckRollbackAction
freeze()freeze(FreezeRequest)FreezeAction
unfreeze()unfreeze(UnfreezeRequest)UnfreezeAction
schedule()schedule(ScheduleRequest)ScheduleTransitionAction
cancelScheduled()cancelScheduled(CancelScheduleRequest)CancelScheduledTransitionAction
expireAt() / extend() / renew() / neverExpire()changeExpiry(ExpiryChangeRequest)ChangeExpiryAction
Lifecycles::sweep() / schedules()->runDue()sweep(?$limit, ?$queue, ?$connection) / runDueSchedules(SweepOptions)RunDueSchedulesAction
schedules()->warn()sendExpiryWarnings(SweepOptions)SendExpiryWarningsAction
schedules()->retry() / for($model)->retryScheduled()retrySchedule(int $scheduleId, ?$connection)RetryScheduleAction
Lifecycles::prune()prune(PruneOptions)PruneAction
for($model)->adopt()adopt($model, ?$lifecycle)AdoptLifecycleAction
model(Model::class)->adopt()adoptAll(Model::class, …)AdoptModelLifecyclesAction
  • Každá metóda manažéra si z aktuálneho kontajnera vezme jednu akciu a zavolá execute(), takže prepísanie akcie v kontajneri platí pre fasádu, injektovaných manažérov, handle aj trait.
  • Handle aj trait HasLifecycle vytvárajú request DTO a volajú manažéra — nikdy nie akciu — takže Lifecycles::fake() vidí každé volanie, nech prišlo akýmkoľvek spôsobom.
  • Lifecycles::fake() vymení manažéra aj v kontajneri, takže sa podvrhnú aj manažéri injektovaní cez konštruktor (LifecycleFake rozširuje LifecycleManager). Priame volanie akcie fake obchádza.
  • attempt() je apply(), ktoré zamietnutie vráti ako TransitionAttempt namiesto vyhodenia; allowDirectWrites() platí v rámci aktuálneho requestu alebo jobu a nemá vlastnú akciu.
  • Manažér je bezpečný pre Octane: nedrží žiadny stav a všetko získava z aktuálneho kontajnera; skompilované definície sú nemenné a zdieľané.

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.