
## Tek dosyalı iş akışları

Bir iş akışı tek bir PHP dosyasında bütünüyle bağımsız hâle getirilebilir. Adım sınıflarını ve oluşturucuyu birlikte tanımlayın, dosyayı bir dizine koyun ve bu dizini `Queuety::load_workflows()` ile yükleyin (aşağıda gösterilmiştir). Queuety kendi başına hiçbir dizini taramaz.

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

Dosya bir `WorkflowBuilder` döndürür. Her adım sınıfı satır içi tanımlanır. Dosya yüklendiğinde sınıflar kullanılabilir hâle gelir ve iş akışı bir şablon olarak kaydedilir.

## İş akışlarını yükleme

Bir dizindeki tüm iş akışı dosyalarını yükleyin:

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

Veya tek bir dosya yükleyin:

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

Ardından ada göre dağıtın:

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

## Özyinelemeli yükleme

Alt dizinleri taramak için ikinci bağımsız değişken olarak `true` verin:

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

Bu, iş akışlarını klasörlerde düzenlemeyi sağlar:

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

## Tüm iş akışı özelliklerini kullanma

Dosya tabanlı iş akışları, şablonda saklanmadığı için `idempotency_key()` dışında oluşturucunun sunduğu her şeyi destekler; bunun yerine her dağıtımda `Queuety::run_workflow( $name, $payload, [ 'idempotency_key' => '...' ] )` ile iletin. Gecikmeler, sinyaller, paralel adımlar, koşullu dallanma, iş akışlarını çalıştırma, iptal işleyicileri ve durum budama özelliklerinin tümü çalışır:

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

## Dosya tabanlı iş akışlarını ne zaman kullanmalı

Dosya tabanlı iş akışları şu durumlarda idealdir:

- Bir LLM veya kod üreteci iş akışlarını programlı olarak oluşturuyorsa
- Bir iş akışı tek dosyaya sığacak kadar basitse
- Adım mantığını iş akışı tanımına yakın tutmak istiyorsanız
- Prototip oluşturuyor ve hızlı yineleme istiyorsanız

Paylaşılan adım sınıfları, karmaşık ara katman yazılımları veya birden çok iş akışında yeniden kullanılan adımlar içeren daha büyük iş akışlarında, PSR-4 otomatik yüklemesiyle ayrı sınıf dosyaları kullanan standart yaklaşım daha kolay bakım sağlar.

## Nasıl çalışır

Arka planda, dosya iş akışları oluşturucuyla API tamamen aynı motoru kullanır. Her adım, veritabanında ayrı bir iştir. Durum, `queuety_workflows` tablosu üzerinden aktarılır. Yeniden oynatma yoktur, determinizm şartı yoktur ve performans farkı bulunmaz.

Her load çağrısı `require` dosyayı yükler (`require_once` değil); bu nedenle her dosyayı istek başına bir kez yükleyin. İki kez yüklemek, sınıflarını yeniden tanımlar ve hataya yol açar. Döndürülen `WorkflowBuilder`, bir `WorkflowTemplate` biçimine dönüştürülür ve `WorkflowRegistry` içinde saklanır. Dağıtım ve yürütme, diğer tüm iş akışlarıyla aynıdır.
