---
title: "Obmedzenia a guardy — Lifecycle for Laravel | Roundly"
description: "Pipeline kontrol v poradí — systémový kontext, pravidlá pre aktéra, Gate abilities, dôvody, payload, vlastné guardy — a všetky kódy zamietnutí."
url: https://roundly-consulting.com/sk/open-source/navody/lifecycle-for-laravel/obmedzenia
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Lifecycle for Laravel](https://roundly-consulting.com/sk/open-source/navody/lifecycle-for-laravel.md)

# Obmedzenia a guardy

Každá kontrola prechádza jednou pipeline v pevnom poradí. Prvé tri kroky sú štrukturálne a vyhodnocovanie zastavia; ostatné sa zbierajú všetky, takže rozhranie môže zobraziť všetky dôvody naraz:

- 1\. Prechod existuje (unknown\_transition, no\_transition\_to\_state), stav nie je koncový (terminal\_state) a prechod odchádza z aktuálneho stavu (not\_from\_current\_state).
- 2\. Očakávaná verzia (stale\_version), zmrazenie (frozen) a zapečatenie (sealed).
- 3\. Kontext: system\_only / system\_not\_allowed.
- 4\. Pravidlá pre aktéra: actor\_required, actor\_not\_allowed, unauthorized (Gate).
- 5\. Vstup: reason\_required, reason\_too\_long, invalid\_payload.
- 6\. Čas: not\_yet\_available, deadline\_passed, min\_dwell\_not\_reached, cooldown\_active.
- 7\. max\_occurrences\_reached, vaše guardy (najprv tie pre celý cyklus), quota\_exceeded.
- 8\. Rate limity (rate\_limited) — započítajú sa, len ak prešlo všetko ostatné.

Soft-deleted subjekt sa zamietne ešte pred všetkými týmito krokmi: aj subject\_trashed je štrukturálny kód a vráti sa ako jediné zamietnutie.

## Systémový kontext

asSystem(), sweep a frontované joby bežia v systémovom kontexte, ktorý preskakuje pravidlá pre aktéra, požiadavku na dôvod, minimálny čas v stave, cooldowny a rate limity. Nastaviť sa dá len v kóde, nikdy cez vstup. Prechod musí deklarovať systemOnly() alebo allowSystem(), aby v ňom mohol bežať. Prechod bez pravidla pre aktéra môže spustiť akákoľvek cesta kódu — ak na aktérovi záleží, pridajte ability(), actors(), actor() alebo requiresActor().

## Deklarovanie obmedzení

```php
$lifecycle->transition('approve')
    ->from('pending')->to('approved')
    ->ability('approve')                                    // Gate / policy
    ->actors(User::class)                                   // only users, not API clients
    ->requiresReason(10)
    ->rules(['note' => 'required|string|max:500'], ['note.required' => 'Say why.'])
    ->when(fn (TransitionContext $context): bool => $context->subject->photos()->exists(), code: 'no_photos')
    ->when(EnsureInvoicePaid::class)                         // a Guard class, resolved per call
    ->notAfter('deadline_at');
```

Gate abilities dostanú subjekt a TransitionContext; chýbajúci aktér znamená actor\_required, nikdy nie „povolené pre hosťa“:

```php
Gate::define('publish', fn (User $user, Listing $listing, TransitionContext $context): bool => $listing->user_id === $user->id);
```

## Vlastné guardy

Guard vráti true alebo null na povolenie, false na zamietnutie so svojím kódom (predvolene guard\_failed) alebo vlastný Denial. Triedy guardov sa z kontajnera získavajú pri každom volaní:

```php
use RoundlyConsulting\Lifecycle\Contracts\Guard;
use RoundlyConsulting\Lifecycle\DataTransferObjects\Denial;
use RoundlyConsulting\Lifecycle\DataTransferObjects\TransitionContext;

final readonly class EnsureInvoicePaid implements Guard
{
    public function __construct(private Billing $billing) {}

    public function check(TransitionContext $context): ?Denial
    {
        return $this->billing->isPaid($context->subject)
            ? null
            : Denial::of('invoice_unpaid', message: 'Pay the invoice first.', retryAfter: now()->addHour()->toImmutable());
    }
}
```

Guardy pre celý cyklus ($lifecycle->guard(...)) bežia pred guardmi prechodu a spustí sa každý guard. Vlastný kód je opakovateľný, len ak nesie retryAfter. Jeho správa pochádza zo zamietnutia, inak z lifecycle::denials.<code>, ak tento kľúč pridáte do lang/vendor/lifecycle, inak sa použije všeobecný text guard\_failed:

```php
// lang/vendor/lifecycle/en/denials.php (after --tag="lifecycle-translations")
return [
    // … package keys …
    'closed_now' => '":transition" is only possible during opening hours.',
];
```

TransitionContext dáva guardom, handlerom aj closures subject, lifecycle, transition (definíciu), from, to, actor, system, reason, payload, now (UTC), version a scheduleId.

## Kódy zamietnutí

Hodnoty DenialCode, s anglickými a slovenskými správami v lifecycle::denials. Opakovateľné zamietnutia nesú retryAfter a sweep naplánované prechody opakuje len pri nich:

| Kód | Opakovateľný | Význam |
| --- | --- | --- |
| `unknown_transition` | — | Prechod neexistuje (štrukturálne). |
| `no_transition_to_state` | — | transitionTo() nenašlo prechod do cieľa (štrukturálne). |
| `terminal_state` | — | Aktuálny stav je koncový (štrukturálne). |
| `not_from_current_state` | — | Prechod neodchádza z aktuálneho stavu (štrukturálne). |
| `subject_trashed` | — | Subjekt je soft-deleted (štrukturálne) — odpoveď check(), allowedTransitions() a canRollback(); apply() a rollback() namiesto toho vyhodia SubjectTrashedException. |
| `stale_version` | — | expectingVersion() už nesedí. |
| `frozen` | — | Cyklus je zmrazený. |
| `sealed` | — | Stav je zapečatený (sealedAfter()). |
| `system_only` | — | Spustiť ho smie len systémový kontext. |
| `system_not_allowed` | — | Systémový kontext ho spustiť nesmie. |
| `actor_required` | — | Vyžaduje sa aktér. |
| `actor_not_allowed` | — | actors() alebo actor() aktéra odmietli. |
| `unauthorized` | — | Gate ability zamietla. |
| `reason_required, reason_too_long` | — | Dôvod chýba alebo je dlhší ako history.reason\_max\_length. |
| `invalid_payload` | — | Validácia payloadu zlyhala; chyby polí sú v errors. |
| `not_yet_available` | ✓ | Okamih z notBefore() ešte nenastal. |
| `deadline_passed` | — | Okamih z notAfter() už uplynul. |
| `min_dwell_not_reached` | ✓ | Minimálny čas v stave ešte neuplynul. |
| `cooldown_active` | ✓ | Cooldown od posledného behu ešte plynie. |
| `max_occurrences_reached` | — | maxOccurrences() je vyčerpané. |
| `guard_failed` | ✓ | Guard zamietol s predvoleným kódom. |
| `quota_exceeded` | ✓ | Kvóta cieľového stavu je plná. |
| `rate_limited` | ✓ | rateLimit() je vyčerpaný. |
| `nothing_to_rollback, not_on_path, state_mismatch, irreversible, not_reversible, rollback_window_passed, rollback_conflict` | — | Zamietnutia rollbacku — pozri Rollbacky a história. |

## 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/lifecycle-for-laravel.md)
