Перейти до основного вмісту
Версія: 2.0

Query

Query дозволяють отримувати інформацію про поточний стан workflow без впливу на його виконання. Це корисно для спостереження та налагодження.

Методи query, безпечні для відтворення​

Query відтворюють зафіксовану історію поточного обраного запуску, а потім викликають анотований метод на відновленому об’єкті workflow. Вони не застосовують неявно прийняті, але ще не застосовані команди signal чи update.

use Workflow\QueryMethod;
use Workflow\V2\Workflow;
use function Workflow\V2\await;

final class ApprovalWorkflow extends Workflow
{
private string $stage = 'booting';

public function handle(): void
{
$this->stage = 'waiting-for-approval';

await('approved-by');

$this->stage = 'approved';
}

#[QueryMethod('current-stage')]
public function currentStage(): string
{
return $this->stage;
}

#[QueryMethod('starts-with')]
public function startsWith(string $prefix): bool
{
return str_starts_with($this->stage, $prefix);
}
}

Звертайтеся до поточного запуску за публічним ідентифікатором екземпляра:

use Workflow\V2\WorkflowStub;

$workflow = WorkflowStub::load('order-123');

$workflow->currentStage(); // "waiting-for-approval"
$workflow->query('starts-with', 'waiting'); // true
$workflow->queryWithArguments('starts-with', ['prefix' => 'waiting']); // true

Щоб явно обрати один історичний чи визначений запуск, виконуйте query через loadRun($runId):

$selectedRun = WorkflowStub::loadRun($runId);

$selectedRun->currentStage();

Поведінка query:

  • Query безпечні для відтворення: вони спостерігають лише зафіксовану історію та не змінюють стан workflow.
  • Аргументи передаються анотованому методу. Оголосіть стабільну публічну назву через #[QueryMethod('public-name')], щоб виклик зберігався після перейменування PHP-методу.
  • load($instanceId) запитує найновіший стійкий запуск екземпляра. loadRun($runId) обирає один конкретний запуск, що корисно для query до continue-as-new.
  • Прийняті, але ще не застосовані signal та update видимі в історії команд, але не враховуються як застосований стан, доки worker не запише SignalApplied / UpdateApplied.

Для визначення методу query у workflow використовуйте анотацію QueryMethod. Необов’язковий рядковий аргумент фіксує публічну стійку назву query, яка зберігається після перейменування PHP-методів:

use Workflow\QueryMethod;
use Workflow\V2\Workflow;

final class MyWorkflow extends Workflow
{
private bool $ready = false;

#[QueryMethod('is-ready')]
public function getReady(): bool
{
return $this->ready;
}
}

Щоб виконати query workflow, викличте метод на екземплярі workflow. Метод query поверне дані з workflow.

use Workflow\V2\WorkflowStub;

$workflow = WorkflowStub::load('order-123');

$ready = $workflow->getReady();
$sameReady = $workflow->query('is-ready');

Використовуйте queryWithArguments(), якщо викликач уже має позиційний список чи мапу іменованих параметрів:

use Workflow\V2\WorkflowStub;

$workflow = WorkflowStub::load('order-123');

$workflow->queryWithArguments('starts-with', [
'prefix' => 'wait',
]);

Waterline використовує контракт query обраного запуску. Панель показує declared_query_targets[*] поряд із signal та update, але виконання query доступне лише за can_query = true. Оператор query обраного чи поточного запуску надсилає JSON arguments до /waterline/api/instances/{instanceId}/queries/{query} або /waterline/api/instances/{instanceId}/runs/{runId}/queries/{query}. Виконання query потребує доступного визначення workflow, оскільки обраний запуск має бути відтворений до виклику методу query. Коли стійкі цілі query існують, але визначення недоступне, деталі обраного запуску повідомляють can_query = false із query_blocked_reason = workflow_definition_unavailable, а POST query повертає HTTP 409 Conflict із blocked_reason = workflow_definition_unavailable. Якщо запуск має лише неповний знімок, який поточна збірка більше не може доповнити, деталі повідомляють declared_contract_source = unavailable. Збережені цілі query залишаються видимими як діагностичні метадані, але іменовані аргументи query відхиляються з 422, доки сумісна збірка не збереже відсутній контракт.

Публічний міст webhook надає той самий безпечний для відтворення API query поза Waterline:

POST /webhooks/instances/{instanceId}/queries/{query}
POST /webhooks/instances/{instanceId}/runs/{runId}/queries/{query}

Ці маршрути webhook приймають те саме поле JSON arguments, що й Waterline, повертають типізований JSON result у разі успіху та використовують однакову форму помилки для некоректних аргументів (422 із validation_errors) та блокування відтворення (409 із blocked_reason). Якщо поточне визначення workflow доступне, викликачі можуть звертатися до query за стійкою ціллю #[QueryMethod('public-name')] чи назвою PHP-методу. Успішні HTTP-відповіді нормалізують query_name до стійкої публічної цілі, щоб зовнішні викликачі не залежали від деталей перейменування методів.

Важливо: query workflow не просуває його виконання, на відміну від signal.