
## Viena faila darbplūsmas

Darbplūsma var būt pilnībā ietverta vienā PHP failā. Definējiet soļu klases un veidotāju kopā, ievietojiet failu direktorijā un ielādējiet šo direktoriju, izmantojot `Queuety::load_workflows()` (parādīts tālāk). Queuety pats par sevi nevienu direktoriju nepārmeklē.

```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');
```

Fails atgriež `WorkflowBuilder`. Katra soļa klase ir definēta tieši failā. Kad fails tiek ielādēts, klases kļūst pieejamas un darbplūsma tiek reģistrēta kā veidne.

## Darbplūsmu ielāde

Ielādējiet visus darbplūsmu failus no direktorijas:

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

Vai ielādējiet vienu failu:

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

Pēc tam nosūtiet izpildei pēc nosaukuma:

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

## Rekursīva ielāde

Nododiet `true` kā otro argumentu, lai pārmeklētu apakšdirektorijas:

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

Tas ļauj kārtot darbplūsmas mapēs:

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

## Visu darbplūsmas funkciju izmantošana

Failos definētas darbplūsmas atbalsta visas veidotāja funkcijas, izņemot `idempotency_key()`, kas veidnē netiek saglabāts; tā vietā nododiet to katrā nosūtīšanas reizē, izmantojot `Queuety::run_workflow( $name, $payload, [ 'idempotency_key' => '...' ] )`. Aizkaves, signāli, paralēlie soļi, nosacījumu atzarošana, darbplūsmu palaišana, atcelšanas apstrādātāji un stāvokļa apgriešana darbojas:

```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);
```

## Kad izmantot failos definētas darbplūsmas

Failos definētas darbplūsmas ir ideāli piemērotas, ja:

- LLM vai koda ģenerators programmatiski veido darbplūsmas
- Darbplūsma ir pietiekami vienkārša, lai ietilptu vienā failā
- Vēlaties soļu loģiku turēt tuvu darbplūsmas definīcijai
- Veidojat prototipu un vēlaties ātri veikt atkārtojumus

Lielākām darbplūsmām ar koplietotām soļu klasēm, sarežģītu starpprogrammatūru vai soļiem, ko izmanto vairākās darbplūsmās, uzturamāka ir standarta pieeja ar atsevišķiem klašu failiem un PSR-4 automātisko ielādi.

## Kā tas darbojas

Zem pārsega failos definētās darbplūsmas izmanto to pašu dzinēju, ko veidotājs API. Katrs solis ir atsevišķs uzdevums datubāzē. Stāvoklis tiek nodots caur tabulu `queuety_workflows`. Atkārtota izpilde nav pieejama, nav nepieciešama deterministiska izpilde un veiktspēja neatšķiras.

Katrs ielādes izsaukums izpilda failu ar `require` (nevis `require_once`), tāpēc katru failu ielādējiet vienreiz pieprasījuma laikā; ielādējot to divreiz, klases tiek deklarētas atkārtoti un rodas kļūda. Atgrieztais `WorkflowBuilder` tiek pārveidots par `WorkflowTemplate` un saglabāts `WorkflowRegistry`. Nosūtīšana un izpilde neatšķiras no citām darbplūsmām.
