artox-lab/abstract-bus-event-message
Installation
composer require artox-lab/abstract-bus-event-message
Add the package service provider to config/app.php under providers:
ArtoxLab\AbstractBusEventMessage\AbstractBusEventMessageServiceProvider::class,
First Use Case: Basic Event Dispatching
Create a simple event class extending AbstractEvent:
namespace App\Events;
use ArtoxLab\AbstractBusEventMessage\AbstractEvent;
class UserRegistered extends AbstractEvent
{
public function __construct(public string $userId) {}
}
Dispatch the event in a controller or service:
use App\Events\UserRegistered;
event(new UserRegistered('user-123'));
Where to Look First
AbstractEvent and AbstractCommand in src/AbstractEvent.php and src/AbstractCommand.php for base implementations.HasBusMessage trait for common bus message methods.AbstractBusEventMessageServiceProvider for bindings and boot logic.Event-Driven Architecture
AbstractEvent for domain events (e.g., OrderCreated, PaymentProcessed).Event::listen or package-specific listeners:
Event::listen(UserRegistered::class, function ($event) {
// Handle registration logic
});
Command Bus Integration
AbstractCommand for actions (e.g., SendWelcomeEmail).Bus facade or a package like spatie/laravel-command-bus:
use App\Commands\SendWelcomeEmail;
use Illuminate\Support\Facades\Bus;
Bus::dispatch(new SendWelcomeEmail($userId));
Message Validation
FormRequest or Illuminate\Contracts\Validation\Validatable for message validation:
use Illuminate\Foundation\Http\FormRequest;
class UserRegistered extends AbstractEvent implements Validatable
{
public function rules(): array
{
return ['userId' => 'required|string'];
}
}
Middleware for Bus Messages
Bus::pipe:
Bus::pipe([
\App\Middleware\LogCommand::class,
\App\Middleware\AuthorizeUser::class,
]);
Event::listen(UserRegistered::class, function ($event) {
broadcast(new UserRegisteredBroadcast($event->userId));
});
Bus::dispatchSync(new SendWelcomeEmail($userId))->onQueue('emails');
Bus::fake() or Event::fake() for unit/feature tests:
Bus::fake();
Bus::assertDispatched(SendWelcomeEmail::class);
Circular Dependencies
EventA dispatches EventB, which dispatches EventA again). Use middleware or guards to prevent infinite loops.Missing Serialization
#[Spatie\LaravelData\Data] or Arrayable for complex data:
use Spatie\LaravelData\Data;
#[Data]
class UserRegistered extends AbstractEvent { ... }
Overuse of Events
Queue Stuck Jobs
failed_jobs table. Use Bus::later() for delayed commands:
Bus::dispatch(new ProcessOrder)->delay(now()->addMinutes(5));
Event::listen('*', function ($event) {
\Log::debug('Event dispatched', ['event' => get_class($event)]);
});
AbstractBusEventMessageServiceProvider to trace bindings.php artisan config:clear
php artisan cache:clear
Custom Metadata Add metadata to messages via traits or interfaces:
interface HasMetadata
{
public function metadata(): array;
}
Dynamic Handlers
Use Laravel’s EventServiceProvider to dynamically register listeners:
protected $listen = [
UserRegistered::class => [
'App\Listeners\SendNotification',
'App\Listeners\UpdateAnalytics',
],
];
Message Retry Logic
Implement ShouldQueue interface for retries:
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
class ProcessPayment extends AbstractCommand implements ShouldQueue
{
use Queueable;
public int $tries = 3;
public static int $wait = 60; // seconds
}
Policy Integration Attach policies to commands/events for authorization:
use Illuminate\Auth\Access\HandlesAuthorization;
class SendEmailCommand extends AbstractCommand
{
use HandlesAuthorization;
public function authorize()
{
return $this->user->can('send-emails');
}
}
How can I help you explore Laravel packages today?