Передавання даних
Передавати дані до workflow можна через метод start().
use Workflow\V2\WorkflowStub;
$workflow = WorkflowStub::make(MyWorkflow::class);
$workflow->start('world');
Аргументи передаються до методу handle() workflow.
Так само можна передавати дані до activity через допоміжну функцію activity().
use function Workflow\V2\activity;
use Workflow\V2\Workflow;
class MyWorkflow extends Workflow
{
public function handle($name)
{
return activity(MyActivity::class, $name);
}
}
Аргументи передаються до методу handle() activity.
use Workflow\V2\Activity;
class MyActivity extends Activity
{
public function handle($name)
{
return "Hello, {$name}!";
}
}
Зазвичай так варто передавати лише невеликі обсяги даних. Замість передавання великих обсягів записуйте дані до бази даних, кешу чи файлової системи. Потім передавайте ключ або шлях до файлу у workflow й activity. Activity зможуть прочитати дані за цим ключем або шляхом.
Коли застосунку потрібно переносити великі обсяги байтів через історію,
наприклад документи, медіа чи серіалізовані експорти, увімкніть
зовнішнє сховище даних для простору
імен. Середовище виконання виносить дані понад поріг до налаштованого об’єктного
сховища та записує в історію оболонку посилання, яку можна перевірити. Це
зберігає цілісність відтворення в межах
payload_size_bytes.
Результат
Після завершення workflow отримати результат можна методом output().
$workflow->output();
=> 'Hello, world!'
Моделі
Передавання моделей працює подібно до 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);
}
}
Коли модель Eloquent передається до workflow або activity, серіалізується лише
її ModelIdentifier. Це зменшує розмір даних і допомагає workflow працювати
ефективно.
object(ModelIdentifier) {
id: 42,
class: "App\Models\User",
relations: [],
connection: "mysql"
}
Під час виконання workflow або activity отримує з бази даних повний екземпляр моделі, включно із завантаженими зв’язками. Якщо потрібно уникнути додаткових запитів до бази даних під час виконання, перетворіть модель на масив перед передаванням.
Впровадження залежностей
Крім передавання даних, можна вказувати типи залежностей у методах handle()
workflow або activity. Сервісний контейнер Laravel автоматично впровадить ці
залежності.
use Illuminate\Contracts\Foundation\Application;
use Workflow\V2\Workflow;
class MyWorkflow extends Workflow
{
public function handle(Application $app)
{
if ($app->runningInConsole()) {
// ...
}
}
}
Впровадження залежностей не послаблює вимогу детермінованості workflow. Workflow
може вказувати типи стабільних сервісів, наприклад контейнера застосунку Laravel
чи засобів читання налаштувань. Але залежності, які виконують роботу, усе одно
потребують правильної стійкої межі. Зовнішнє введення-виведення, доступ до бази
даних, виклики сервісів та іншу роботу, яка може зазнати збою чи потребує повторних
спроб, розміщуйте в activity(...) або localActivity(...). Використовуйте
sideEffect() лише для одноразового знімка значення, безпечного для відтворення,
який має бути зафіксований в історії: читання реального часу, згенерованого
випадкового значення або налаштування, збереженого в момент рішення.