İçeriğe geç

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:

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