Installation
composer require ejm/flow
Ensure estevejm/simplebus is installed (Flow depends on it).
Service Provider
Register the package in config/app.php under providers:
Estevejm\Flow\FlowServiceProvider::class,
Configuration Publish the config file:
php artisan vendor:publish --provider="Estevejm\Flow\FlowServiceProvider"
Update config/flow.php with your message bus configuration (e.g., RabbitMQ, Redis).
First Use Case: Tracking a Message
Inject the Flow facade or service into a command/handler:
use Estevejm\Flow\Facades\Flow;
public function handle()
{
Flow::track('user.created', ['user_id' => 123]);
}
Tracking Messages
Use Flow::track($messageName, $payload) in:
UserCreated event).UserProcessedJob::dispatch() → Flow::track('user.processed')).Visualizing Flow
config/flow.php:
'ui' => [
'enabled' => true,
'port' => 8080,
],
http://localhost:8080 (or your configured port).Integrating with SimpleBus
public function handle($command)
{
Flow::track('command.' . get_class($command), $command->toArray());
// ... rest of logic
}
Customizing Message Metadata Add context to messages for richer visualization:
Flow::track('order.placed', [
'order_id' => 456,
'user_id' => 123,
'status' => 'pending',
], [
'source' => 'api',
'priority' => 'high',
]);
Message Naming Collisions
message.sent. Use namespaces (e.g., user.profile.updated).Flow::getMessageName() method if dynamic naming is needed.Performance Overhead
Flow::track() sparingly for critical paths or sample messages.UI Configuration Conflicts
flow-ui is installed separately (composer require ejm/flow-ui).8080).SimpleBus Dependency
SimpleBus\Message\Message interface or extend the package.Check Logs
Enable debug mode in config/flow.php:
'debug' => env('APP_DEBUG', false),
Logs will appear in storage/logs/flow.log.
Verify Message Storage
By default, messages are stored in storage/framework/flow. Clear old data with:
php artisan flow:clear
UI Not Loading?
php artisan flow:ui
Custom Storage
Override the FlowStorage interface to use a database or external service:
// config/flow.php
'storage' => [
'driver' => 'custom',
'class' => App\Services\CustomFlowStorage::class,
],
Message Filters
Filter messages before visualization (e.g., exclude debug.*):
// app/Providers/FlowServiceProvider.php
public function boot()
{
Flow::filter(function ($message) {
return !str_starts_with($message->name, 'debug.');
});
}
Event Listeners
Attach listeners to Flow::messageTracked for post-processing:
Flow::listen('messageTracked', function ($message) {
// Send to external monitoring tool
});
How can I help you explore Laravel packages today?