メインコンテンツまでスキップ
バージョン: 2.0

ワークフローの制約

ワークフロークラスは、時間とともに変わる外部状態やサービスに依存できません。現在日時、現在のユーザー、外部ネットワークリソースなど、変化しうる情報を直接使わないでください。

ワークフロー内では次の操作を避けます。

  • 現在日時を読む Carbon::now() は、呼び出すたびに値が変わります。Workflow\V2\Workflow::now() または Workflow\V2\now() を使うと、リプレイに安全なワークフロー時刻を得られます。
  • 現在のユーザーを読む Auth::user() は、ログイン中のユーザーに依存します。開始時にユーザーを入力として渡してください。
  • 外部ネットワークへの直接リクエストは、応答、速度、可用性が変化します。必要なデータを開始時の入力に渡すか、アクティビティで取得してください。
  • sideEffect に結果を記録する場合を除き、乱数生成器などのランダムな値を使わないでください。必要な値を開始時の入力に渡す方法もあります。

起動時のチェック​

workflows.v2.types.workflows に登録したクラスは、アプリ起動時にスキャンされます。Carbon::now()、Auth::user()、DB::、Http::、random_int() など、明らかにリプレイに安全でない呼び出しを検出します。workflows.v2.guardrails.boot で対応を指定します。

モード動作
warn(既定)検出ごとに警告を記録し、アプリの起動を妨げません。
silent起動時スキャンを省略します。
throw最初の検出で LogicException を投げます。CI に適しています。
// config/workflows.php
'v2' => [
'guardrails' => [
'boot' => env('DW_V2_GUARDRAILS_BOOT', 'warn'),
],
],

CI では DW_V2_GUARDRAILS_BOOT=throw にして、安全でないリプレイ呼び出しの追加を拒否します。本番では warn を使い、未検出の問題がデプロイを停止させないようにします。

初回リリースでは、起動時スキャンだけがワークフローをブロックできる決定性チェックです。ランタイムはワークフロータスクの取得時に決定性診断を再実行しません。2.0 では、ローカルに登録した PHP ワークフローをデプロイ前に検査し、長期間実行中の定義フィンガープリントの変化は Waterline に表示します。異なるビルド間のタスク取得が、新たなデプロイ障害の原因になるのを避けています。

フィンガープリント記録以前の実行にも、保守的な方針を適用します。新しい getVersion() 分岐に到達した実行の WorkflowStarted 履歴がフィンガープリントのスナップショットより古い場合、ランタイムは WorkflowStub::DEFAULT_VERSION を維持します。現在の定義で安全にリプレイできるとは仮定しません。バージョン管理を参照してください。