The Safemood/laravel-workflow
package by Khalil Bouzidi simplifies workflows in Laravel with clear action definitions and event tracking. With this package, you can define complex workflows, break them up into actions, and define events.
At a high level, this package defines Workflow
classes, which consist of one or more Action
classes. You can create actions and workflows using the package’s provided command:
php artisan make:workflow PaymentWorkflowphp artisan make:action ValidateCartItems
The project’s readme has this example for a ValidateCartItems
action:
namespace App\Actions; use Safemood\Workflow\Action; class ValidateCartItems extends Action{ public function handle(array &$context) { // Simulate extra validation logic if (empty($context['cart'])) { throw new \Exception('Cart is empty'); } // you can pass data to the next action if you want $context['validated'] = true; }}
In the workflow’s handle()
method, you can define before, main, and "after" actions and track events. Here’s an example PaymentWorkflow handle
method from the package’s readme:
public function handle(){ // Actions to be executed before the main action $this->addBeforeActions([ new ValidateCartItems(), new CalculateTotal() ]); // The main action of the workflow $this->addMainAction(new MakePayment()); // Actions to be executed after the main action $this->addAfterAction(new SendEmails()); // Normal laravel Job in this example // Observers to register for specific entities $this->registerObservers([ Order::class => OrderObserver::class, ]); $this->trackEvents([ PaymentProcessed::class ]);}
Finally, you can run the workflow and assert the results from the workflow:
$context = [ 'cart' => [ ['id' => 1, 'name' => 'Product A', 'price' => 100, 'quantity' => 2], ['id' => 2, 'name' => 'Product B', 'price' => 50, 'quantity' => 1] ], 'user_id' => 123]; // Execute the PaymentWorkflow with the provided context$paymentWorkflow = (new PaymentWorkflow)->run($context); // Check if the workflow execution was successful$success = $paymentWorkflow->passes(); // Check if the workflow execution failed$failure = $paymentWorkflow->failed();
You can learn more about this package, get full installation instructions, and view the source code on GitHub. You can install this package via Composer for Laravel v10 and v11 using the following command:
composer require safemood/laravel-workflow