DI a akcie
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ády | Metóda manažéra | Akcia |
|---|---|---|
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 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.