1. Go to this page and download the library: Download safemood/laravel-workflow library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
safemood / laravel-workflow example snippets
namespace App\Actions;
use Safemood\Workflow\Action;
use App\DTO\CartDTO;
class ValidateCartItems extends Action
{
public function handle(CartDTO &$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;
}
}
namespace App\Workflows;
use App\Actions\CalculateTotal;
use App\Actions\MakePayment;
use App\Actions\ValidateCartItems;
use App\Events\PaymentProcessed;
use App\Jobs\SendEmails;
use App\Observers\UserObserver;
use App\Models\Order;
use Safemood\Workflow\WorkflowManager;
class PaymentWorkflow extends WorkflowManager
{
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,
]);
// Good Debugging or if you want to understand what is happining during the workflow execution:
$this->trackEvents([
PaymentProcessed::class
]);
// $this->trackAllEvents(); // or
// $this->trackEventsIn('App\Events\\');
}
}
namespace App\Http\Controllers;
use App\Workflows\PaymentWorkflow;
use Illuminate\Http\Request;
use App\DTO\CartDTO;
class PaymentController extends Controller
{
public function payment(Request $request)
{
// Example context data representing a user's cart and user information
$context = new CartDTO(
[
['id' => 1, 'name' => 'Product A', 'price' => 100, 'quantity' => 2],
['id' => 2, 'name' => 'Product B', 'price' => 50, 'quantity' => 1]
],
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();
// Dump the workflow for debugging
// $paymentWorkflow->dd();
// Handle the response based on the workflow outcome
if ($success) {
return $paymentWorkflow->successResponse();
}
return $paymentWorkflow->failureResponse();
}
}
namespace App\Workflows;
use App\Actions\CalculateTotal;
use App\Actions\MakePayment;
use App\Actions\ValidateCartItems;
use App\Actions\SendEmailReceipt;
use Safemood\Workflow\WorkflowManager;
class PaymentWorkflow extends WorkflowManager
{
public function handle()
{
$this->when(false, function () {
$this->trackAllEvents();
});
$this->when(true, function () {
$this->registerObservers([
DummyModel::class => DummyModelObserver::class,
]);
});
$this->when(true, function () {
$this->addBeforeActions([
new DummyAction(),
new DummyAction(),
]);
});
$this->unless(
value: false,
callback: fn () => $this->trackAllEvents(),
default: fn () => $this->doSomething()
);
}
}
namespace App\DTO;
use Safemood\Workflow\DTO\BaseDTO;
class CartDTO extends BaseDTO
{
public function __construct(
public array $cart,
public int $user_id,
public bool $validated = false
) {}
// BaseDTO already implements the DTOInterface
// Automatically generates getter, setter, and toArray() methods
}