
## Vieno failo darbo eigos

Darbo eiga gali būti visiškai aprašyta viename PHP faile. Apibrėžkite žingsnių klases ir kūrimo priemonę kartu, įdėkite failą į katalogą ir įkelkite tą katalogą naudodami `Queuety::load_workflows()` (kaip parodyta toliau). Queuety pati savaime nenuskaito jokių katalogų.

```php
// workflows/onboard-user.php
use Queuety\Queuety;

class CreateAccount implements \Queuety\Step {
    public function handle(array $state): array {
        $user = create_user($state['email']);
        return ['user_id' => $user->id, 'user_name' => $user->name];
    }
    public function config(): array {
        return ['max_attempts' => 3];
    }
}

class SendWelcome implements \Queuety\Step {
    public function handle(array $state): array {
        wp_mail($state['email'], 'Welcome ' . $state['user_name'], '...');
        return ['welcomed' => true];
    }
    public function config(): array {
        return [];
    }
}

return Queuety::define_workflow('onboard_user')
    ->then(CreateAccount::class, 'create_account')
    ->then(SendWelcome::class, 'send_welcome');
```

Failas grąžina `WorkflowBuilder`. Kiekviena žingsnio klasė apibrėžta faile. Įkėlus failą, klasės tampa pasiekiamos, o darbo eiga užregistruojama kaip šablonas.

## Darbo eigų įkėlimas

Įkelkite visus darbo eigos failus iš katalogo:

```php
// Load all .php files from the workflows directory
$count = Queuety::load_workflows(__DIR__ . '/workflows/');
```

Arba įkelkite vieną failą:

```php
$template = Queuety::load_workflow_file(__DIR__ . '/workflows/onboard-user.php');
```

Tada išsiųskite vykdyti pagal pavadinimą:

```php
$workflow_id = Queuety::run_workflow('onboard_user', ['email' => 'user@example.com']);
```

## Rekursyvus įkėlimas

Norėdami nuskaityti pakatalogius, kaip antrą argumentą perduokite `true`:

```php
Queuety::load_workflows(__DIR__ . '/workflows/', recursive: true);
```

Taip darbo eigas galima suskirstyti į aplankus:

```
workflows/
├── onboarding/
│   ├── new-user.php
│   └── trial-upgrade.php
├── reports/
│   ├── daily-summary.php
│   └── weekly-digest.php
└── notifications/
    └── digest-email.php
```

## Visų darbo eigos funkcijų naudojimas

Darbo eigų failuose palaikoma viskas, ką palaiko kūrimo priemonė, išskyrus `idempotency_key()`, kuris šablone neišsaugomas; perduokite jį kiekvieno išsiuntimo vykdyti metu naudodami `Queuety::run_workflow( $name, $payload, [ 'idempotency_key' => '...' ] )`. Taip pat veikia delsos, signalai, lygiagretūs žingsniai, sąlyginis šakojimasis, darbo eigų vykdymas, atšaukimo apdorojimo funkcijos ir būsenos apkarpymas:

```php
// workflows/approval-flow.php
use Queuety\Queuety;

class SubmitRequest implements \Queuety\Step {
    public function handle(array $state): array {
        return ['submitted_at' => date('Y-m-d H:i:s')];
    }
    public function config(): array { return []; }
}

class ProcessApproval implements \Queuety\Step {
    public function handle(array $state): array {
        return [
            'approved_by' => $state['approved_by'],
            'processed' => true,
        ];
    }
    public function config(): array { return []; }
}

class CleanupRequest implements \Queuety\Handler {
    public function handle(array $payload): void {
        delete_pending_request($payload['request_id']);
    }
    public function config(): array { return []; }
}

return Queuety::define_workflow('approval_flow')
    ->then(SubmitRequest::class)
    ->delay(hours: 24)
    ->wait_for_signal('approved')
    ->then(ProcessApproval::class)
    ->on_cancel(CleanupRequest::class)
    ->prune_state_after(2);
```

## Kada naudoti darbo eigas failuose

Darbo eigos failuose ypač tinka, kai:

- LLM arba kodo generatorius programiškai kuria darbo eigas
- Darbo eiga pakankamai paprasta, kad tilptų į vieną failą
- Norite laikyti žingsnių logiką šalia darbo eigos apibrėžties
- Kuriate prototipą ir norite greitai kartoti pakeitimus

Didesnėms darbo eigoms su bendromis žingsnių klasėmis, sudėtinga tarpine programine įranga arba žingsniais, naudojamais keliose darbo eigose, lengviau prižiūrėti įprastą metodą: atskirus klasių failus su PSR-4 automatiniu įkėlimu.

## Kaip tai veikia

Viduje darbo eigų failuose naudojamas lygiai tas pats variklis kaip ir kūrimo priemonėje API. Kiekvienas žingsnis duomenų bazėje yra atskira užduotis. Būsena perduodama per lentelę `queuety_workflows`. Pakartotinio vykdymo nėra, deterministiškumo reikalavimo nėra ir našumas nesiskiria.

Kiekvienas įkėlimo iškvietimas `require`ina failą (o ne `require_once`), todėl kiekvieną failą įkelkite tik kartą per užklausą; įkėlus jį dukart, klasės deklaruojamos iš naujo ir įvyksta klaida. Grąžintas `WorkflowBuilder` konvertuojamas į `WorkflowTemplate` ir išsaugomas `WorkflowRegistry`. Išsiuntimas vykdyti ir vykdymas veikia taip pat kaip bet kurioje kitoje darbo eigoje.
