Zum Hauptinhalt springen
Version: 2.x

Daten übergeben

Sie können Daten über die Methode start() an einen Workflow übergeben.

use Workflow\V2\WorkflowStub;

$workflow = WorkflowStub::make(MyWorkflow::class);
$workflow->start('world');

Die Argumente werden an die Methode handle() des Workflows übergeben.

Ebenso können Sie Daten über die Hilfsfunktion activity() an eine Aktivität übergeben.

use function Workflow\V2\activity;
use Workflow\V2\Workflow;

class MyWorkflow extends Workflow
{
public function handle($name)
{
return activity(MyActivity::class, $name);
}
}

Die Argumente werden an die Methode handle() der Aktivität übergeben.

use Workflow\V2\Activity;

class MyActivity extends Activity
{
public function handle($name)
{
return "Hello, {$name}!";
}
}

Übergeben Sie auf diese Weise grundsätzlich nur kleine Datenmengen. Schreiben Sie größere Datenmengen stattdessen in die Datenbank, den Cache oder das Dateisystem. Übergeben Sie dann den Schlüssel oder Dateipfad an den Workflow und die Aktivitäten. Die Aktivitäten können damit die Daten lesen.

Wenn die Anwendung tatsächlich große Byte-Mengen durch die Historie transportieren muss, etwa Dokumente, Medienblobs oder serialisierte Exporte, aktivieren Sie externen Payload-Speicher im Namespace. Die Laufzeit lagert Payloads oberhalb des Schwellenwerts in einen konfigurierten Objektspeicher aus und zeichnet einen überprüfbaren Referenzumschlag in der Historie auf. So bleibt die Replay-Integrität erhalten, während die strukturelle Grenze payload_size_bytes eingehalten wird.

Ausgabe​

Nach Abschluss des Workflows können Sie die Ausgabe mit der Methode output() abrufen.

$workflow->output();
=> 'Hello, world!'

Modelle​

Das Übergeben von Modellen funktioniert ähnlich wie SerializesModels.

use App\Models\User;
use function Workflow\V2\activity;
use Workflow\V2\Workflow;

class MyWorkflow extends Workflow
{
public function handle(User $user)
{
return activity(MyActivity::class, $user->name);
}
}

Wird ein Eloquent-Modell an einen Workflow oder eine Aktivität übergeben, wird nur sein ModelIdentifier serialisiert. Das verringert die Payload-Größe und hält Ihre Workflows effizient und leistungsfähig.

object(ModelIdentifier) {
id: 42,
class: "App\Models\User",
relations: [],
connection: "mysql"
}

Wenn der Workflow oder die Aktivität läuft, wird die vollständige Modellinstanz einschließlich geladener Beziehungen aus der Datenbank abgerufen. Wenn Sie zusätzliche Datenbankaufrufe während der Ausführung vermeiden möchten, können Sie das Modell vor der Übergabe in ein Array umwandeln.

Dependency Injection​

Zusätzlich zur Datenübergabe können Sie Abhängigkeiten über Typdeklarationen an den handle()-Methoden von Workflow oder Aktivität anfordern. Der Laravel-Service-Container injiziert diese Abhängigkeiten automatisch.

use Illuminate\Contracts\Foundation\Application;
use Workflow\V2\Workflow;

class MyWorkflow extends Workflow
{
public function handle(Application $app)
{
if ($app->runningInConsole()) {
// ...
}
}
}

Dependency Injection lockert den Workflow-Determinismus nicht. Ein Workflow kann stabile Dienste wie den Laravel-Anwendungscontainer oder Konfigurationsleser über Typdeklarationen anfordern. Injizierte Abhängigkeiten, die Arbeit ausführen, benötigen aber weiterhin die passende dauerhafte Grenze. Platzieren Sie externe Ein-/Ausgabe, Datenbankzugriffe, Dienstaufrufe oder andere Arbeit, die fehlschlagen oder wiederholt werden kann, in activity(...) oder localActivity(...). Verwenden Sie sideEffect() nur für einen einmaligen Replay-sicheren Wertesnapshot, der in der Historie eingefroren werden soll, etwa die aktuelle Uhrzeit, erzeugten Zufall oder einen zum Entscheidungszeitpunkt erfassten Konfigurationswert.