PHP code example of safemood / laravel-workflow

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;

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; 
        
    }
}



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;

class PaymentController extends Controller
{
    public function payment(Request $request)
    {
        // Example context data representing a user's cart and user information
        $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();

        // 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()
        );
    }
}
bash
php artisan make:workflow PaymentWorkflow
bash
php artisan make:workflow-action ValidateCartItems