
# Darbību palaidēji

`Queuety::on_action()` ļauj pārvērst parastu WordPress darbību par noturīgas darbplūsmas palaišanu.

Tas nodrošina skaidru savienojumu:

`WordPress action -> mapped payload -> durable workflow`

Tas noder, ja interesējošais notikums jau ir WordPress, bet dārgā vai ilgstošā reakcija jāveic asinhroni.

## Piemērs: pārskatiet saturu, kad ziņa ir saglabāta

```php
use Queuety\Queuety;

Queuety::on_action(
    'save_post',
    workflow: 'content_review',
    map: static fn ( int $post_id, object $post, bool $update ): array => [
        'post_id' => $post_id,
        'post_type' => $post->post_type,
        'update' => $update,
    ],
    when: static fn ( int $post_id, object $post ): bool => 'post' === $post->post_type,
    idempotency_key: static fn ( int $post_id ): string => "save_post:{$post_id}",
);
```

Šajā piemērā:

- `save_post` joprojām ir sākotnējais WordPress notikums
- `map` pārvērš neapstrādātus āķa argumentus vienkāršā darbplūsmas stāvoklī
- `when` izlaiž nevēlamus notikumus, pirms tie tiek ievietoti rindā
- `idempotency_key` nepieļauj, ka atkārtoti āķa izsaukumi palaiž dublētas izpildes

## Kas darbojas sinhroni

Pati darbības atzvanīšanas funkcija joprojām darbojas pašreizējā WordPress pieprasījuma ietvaros.

Tas nozīmē, ka šīs daļas ir sinhronas:

- `when`
- `map`
- `idempotency_key`

Tikai darbplūsmas darbības pēc palaišanas darbojas asinhroni.

## Datu noteikumi

Kartētajos datos jābūt vienkāršiem masīviem, skalāriem un `null`.

Nenododiet neapstrādātus WordPress objektus, piemēram, `WP_Post`, tieši darbplūsmas stāvoklī. Vispirms normalizējiet tos ar `map()`:

```php
Queuety::on_action(
    'save_post',
    workflow: 'content_review',
    map: static fn ( int $post_id, object $post, bool $update ): array => [
        'post_id' => $post_id,
        'post_type' => $post->post_type,
        'post_status' => $post->post_status,
        'update' => $update,
    ],
);
```

Atslēgas, kas sākas ar `_`, tiek noraidītas, jo šie nosaukumi ir rezervēti iekšējam darbplūsmas stāvoklim.

## Pieņemtie argumenti

Reģistrējot darbības atzvanīšanas funkciju, WordPress nepieciešams norādīt `accepted_args` skaitu.

Queuety to pēc noklusējuma nosaka pēc jūsu `map`, `when` un `idempotency_key` atzvanīšanas funkcijām, tāpēc parasti papildu konfigurācija nav vajadzīga:

```php
Queuety::on_action(
    'save_post',
    workflow: 'content_review',
    map: static fn ( int $post_id, object $post, bool $update ): array => [
        'post_id' => $post_id,
        'update' => $update,
    ],
);
```

Ja nepieciešama manuāla maiņa, skaidri norādiet `accepted_args`:

```php
Queuety::on_action(
    'comment_post',
    workflow: 'comment_review',
    accepted_args: 2,
);
```

## Darbplūsmu veidotāji kodā

Varat palaist reģistrētu darbplūsmas nosaukumu vai iekļautu `WorkflowBuilder`.

Iekļautie veidotāji noder, ja āķim paredzētā darbplūsma ir definēta tajā pašā sāknēšanas failā:

```php
$review = Queuety::workflow( 'comment_review' )
    ->then( ModerateCommentStep::class )
    ->then( NotifyModeratorStep::class );

Queuety::on_action(
    'comment_post',
    workflow: $review,
    map: static fn ( int $comment_id ): array => [
        'comment_id' => $comment_id,
    ],
    idempotency_key: static fn ( int $comment_id ): string => "comment:{$comment_id}",
);
```

## Kad šī pieeja ir piemērota

Izmantojiet darbību palaidējus, ja:

- WordPress jau izsauc vajadzīgo notikumu
- reakcijai jāspēj pārdzīvot pieprasījuma noildze vai izpildītāja restartēšana
- turpmākais darbs var sazaroties, gaidīt vai prasīt apstiprinājumu
- atkārtotu āķa izsaukumu gadījumā jānodrošina noturīga idempotence

Izsauciet `Queuety::dispatch()` vai `Queuety::workflow()` tieši, ja darbs nav saistīts ar WordPress notikuma robežu.

## Neizmantot filtriem

`Queuety::on_action()` ir paredzēts tikai darbībām.

Filtri ir sinhronas transformācijas, kas notiek pieprasījuma apstrādes laikā. Parasti tiem jāpaliek sinhroniem, jo WordPress sagaida, ka filtrētā vērtība tiks atgriezta nekavējoties.
