Installation Add the package via Composer (though archived, ensure compatibility with your Laravel/Eloquent setup):
composer require cleverage/eav-process-bundle
Register the bundle in config/app.php under providers (if using Symfony/Laravel bridge):
CleverAge\EAVProcessBundle\CleverAgeEAVProcessBundle::class
First Use Case: Process Definition
Define a process in config/eav_processes.php (or via YAML/XML if supported):
'processes' => [
'user_approval' => [
'steps' => [
'submit' => ['handler' => 'App\Handlers\SubmitStep'],
'review' => ['handler' => 'App\Handlers\ReviewStep'],
],
],
],
Triggering a Process
Inject the ProcessManager and start a process:
$process = $processManager->create('user_approval', $entityId);
$process->execute(); // Runs steps sequentially
Event-Driven Processes
Hook into ProcessStarted, StepExecuted, or ProcessCompleted events (if event system exists):
event(new ProcessStarted($process));
Step Handlers
Implement ProcessStepInterface for custom logic:
class SubmitStep implements ProcessStepInterface {
public function execute($entity, array $context) {
// Business logic (e.g., validate, persist)
return ['status' => 'submitted'];
}
}
Context Passing
Pass data between steps via $context array:
// Step 1
$context['reviewer_id'] = 123;
// Step 2 (access via $context)
$reviewer = User::find($context['reviewer_id']);
Conditional Steps Dynamically add steps based on runtime conditions:
if ($entity->isUrgent()) {
$process->addStep('priority_review', ['handler' => 'App\Handlers\UrgentReview']);
}
Service Container Binding Bind custom step handlers as singletons:
$this->app->singleton('App\Handlers\ReviewStep');
Database Integration
Store process state in a processes table (if not using EAVManager):
Schema::create('processes', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->json('context');
$table->string('current_step');
$table->timestamps();
});
Queueable Processes Dispatch long-running processes to queues:
ProcessJob::dispatch($process)->onQueue('processes');
Archived Package Risks
State Management
$process->getContext() in session() or Redis.Error Handling
try-catch:
try {
$process->execute();
} catch (ProcessException $e) {
$process->markFailed($e->getMessage());
}
Circular Dependencies
Avoid steps that reference each other (e.g., step_a calls step_b, which calls step_a).
Log Context
Dump $process->getContext() at each step for debugging:
\Log::debug('Current context:', $context);
Step Isolation Test steps in isolation:
$handler = new SubmitStep();
$result = $handler->execute($entity, []);
Custom Process Storage
Override ProcessManager to use your preferred storage (e.g., DynamoDB):
class CustomProcessManager extends ProcessManager {
public function save(Process $process) {
// Custom logic
}
}
Validation
Add validation to steps using Laravel’s Validator:
$validator = Validator::make($context, [
'reviewer_id' => 'required|exists:users,id',
]);
Retry Mechanism Implement retries for failed steps:
if ($process->hasFailed()) {
$process->retry(); // Re-execute last step
}
user_approval) to avoid issues with YAML/XML parsing.How can I help you explore Laravel packages today?