
# İş Akışlarını Çalıştırma

Bir iş akışı, adımlarından biri olarak bir alt iş akışı başlatabilir. Üst iş akışı, alt iş akışı tamamlanana kadar bekler; ardından alt iş akışının son durumunu kendi durumuyla birleştirir.

## `->run_workflow()` yöntemi

```php
use Queuety\Queuety;

$enrichment = Queuety::workflow( 'enrich_user' )
    ->then( FetchSocialHandler::class )
    ->then( FetchCreditScoreHandler::class );

Queuety::workflow( 'onboarding' )
    ->then( CreateAccountHandler::class )
    ->run_workflow( 'enrich_user', $enrichment )
    ->then( SendWelcomeEmailHandler::class )
    ->dispatch( [ 'email' => 'user@example.com' ] );
```

`run_workflow()` yöntemi iki bağımsız değişken alır:
1. Çalıştırılacak iş akışı için bir ad
2. Çalıştırılacak iş akışının adımlarını tanımlayan bir `WorkflowBuilder` örneği

## Nasıl çalışır

Üst iş akışı bir `run_workflow` adımına ulaştığında:

1. Çalıştırılacak iş akışı, kendi kimliği olan bağımsız bir iş akışı olarak gönderilir
2. Üst iş akışı duraklatılır
3. Çalıştırılacak iş akışı adımlarını normal biçimde yürütür
4. Çalıştırılacak iş akışı tamamlandığında son durumu üst iş akışının durumuyla birleştirilir
5. Üst iş akışı sonraki adımla devam eder

## Üst/alt iş akışı durumu

Çalıştırılacak iş akışı, üst iş akışının o ana kadar biriktirdiği mevcut durumu başlangıç yükü olarak alır. Böylece alt adımlar, önceki üst adımların ürettiği tüm verilere erişebilir:

```php
class CreateAccountHandler implements Step {
    public function handle( array $state ): array {
        $user_id = wp_create_user( $state['email'], wp_generate_password() );
        return [ 'user_id' => $user_id ];
    }

    public function config(): array {
        return [];
    }
}

// This run-workflow step can access 'user_id' from the parent
class FetchSocialHandler implements Step {
    public function handle( array $state ): array {
        $profile = fetch_social_profile( $state['user_id'] );
        return [ 'social_data' => $profile ];
    }

    public function config(): array {
        return [];
    }
}
```

## Durum birleştirme

Çalıştırılacak iş akışı tamamlandığında, son durumu (`_steps`, `_queue`, `_priority`, `_max_attempts` gibi dahili anahtarlar hariç) üst iş akışının durumuyla birleştirilir. Üst iş akışındaki sonraki adım, hem önceki üst adımların hem de çalıştırılacak iş akışının tüm verilerini görür:

```php
class SendWelcomeEmailHandler implements Step {
    public function handle( array $state ): array {
        // Has access to:
        // - $state['email'] (from initial dispatch)
        // - $state['user_id'] (from CreateAccountHandler)
        // - $state['social_data'] (from run-workflow's FetchSocialHandler)
        // - $state['credit_score'] (from run-workflow's FetchCreditScoreHandler)

        send_welcome_email( $state['email'], $state['social_data'] );
        return [ 'welcome_sent' => true ];
    }

    public function config(): array {
        return [];
    }
}
```

## Çalıştırılacak iş akışı seçenekleri

Çalıştırılacak iş akışı oluşturucusunun `on_queue()`, `with_priority()` ve `max_attempts()` değerleri alt iş akışına uygulanır. Alt oluşturucudaki `on_cancel()`, `prune_state_after()`, `must_complete_within()`, `version()`, `idempotency_key()`, `max_*()` bütçeleri ve `compensate_on_failure()` gibi diğer iş akışı düzeyindeki seçenekler aktarılmaz:

```php
$sub = Queuety::workflow( 'heavy_processing' )
    ->on_queue( 'background' )
    ->with_priority( Priority::Normal )
    ->max_attempts( 5 )
    ->then( StepA::class )
    ->then( StepB::class );

Queuety::workflow( 'parent' )
    ->run_workflow( 'heavy', $sub )
    ->then( FinalStep::class )
    ->dispatch( $payload );
```

## İç içe çalıştırılan iş akışları

Çalıştırılacak iş akışları kendi içlerinde başka iş akışları da çalıştırabilir; böylece istenen derinlikte iç içe yerleştirme yapılabilir:

```php
$inner = Queuety::workflow( 'inner' )
    ->then( InnerStepA::class )
    ->then( InnerStepB::class );

$middle = Queuety::workflow( 'middle' )
    ->then( MiddleStepA::class )
    ->run_workflow( 'inner', $inner )
    ->then( MiddleStepB::class );

Queuety::workflow( 'outer' )
    ->then( OuterStepA::class )
    ->run_workflow( 'middle', $middle )
    ->then( OuterStepB::class )
    ->dispatch( $payload );
```
