Skip to main content

EventSystem Service

The EventSystem service provides comprehensive CRUD operations and dynamic event management functionality for Laravel Event System. You can use it directly via the service class or through the convenient Facade.

Namespace

JobMetric\EventSystem\EventSystem

Facade

For convenience, you can use the EventSystem Facade:

use JobMetric\EventSystem\Facades\EventSystem;

Basic CRUD Operations

Store

Create a new event-listener binding.

use JobMetric\EventSystem\Facades\EventSystem;

$response = EventSystem::store([
'name' => 'user.created',
'description' => 'Send welcome email when user registers',
'event' => App\Events\UserCreated::class,
'listener' => App\Listeners\SendWelcomeEmail::class,
'priority' => 10,
'status' => true,
]);

Available Fields:

  • name (string, required): Unique name identifier for the event binding
  • description (string, nullable): Optional description
  • event (string, required): Fully qualified event class name
  • listener (string, required): Fully qualified listener class name
  • priority (int, nullable): Execution priority (default: 0)
  • status (bool): Active status (default: true)

Minimal Example:

$response = EventSystem::store([
'name' => 'order.completed',
'event' => App\Events\OrderCompleted::class,
'listener' => App\Listeners\SendOrderConfirmation::class,
]);

Query

Build a query builder instance with filtering, sorting, and selected fields.

$query = EventSystem::query(['status' => true])
->where('priority', '>', 5)
->orderBy('priority', 'desc');

$events = $query->get();

Available Filters:

All fields can be filtered: id, name, description, event, listener, priority, status, created_at, updated_at

Example:

// Filter by status
$activeEvents = EventSystem::query(['status' => true])->get();

// Filter by event class
$userEvents = EventSystem::query(['event' => App\Events\UserCreated::class])->get();

// Complex filtering
$events = EventSystem::query()
->where('status', true)
->where('priority', '>', 5)
->orderBy('priority', 'desc')
->get();

All

Return all event system records without pagination.

$events = EventSystem::all();

// With filters
$activeEvents = EventSystem::all(['status' => true]);

Paginate

Return a paginated collection of event system records.

$events = EventSystem::paginate();

// With filters and custom page limit
$events = EventSystem::paginate(['status' => true], 20);

Returns: LengthAwarePaginator

Delete

Delete an event system record by its unique name.

$response = EventSystem::delete('user.created');

Events Fired:

  • EventSystemDeletingEvent - Before deletion
  • EventSystemDeletedEvent - After deletion

Toggle Status

Toggle the boolean 'status' field of a given event system record.

$response = EventSystem::toggleStatus($eventId);

Example:

// Disable an event
$response = EventSystem::toggleStatus($eventId);

// Re-enable it later
$response = EventSystem::toggleStatus($eventId);

Response Format

All methods return a Response object with the following structure:

Response::make(
bool $success,
string $message,
mixed $data = null,
int $code = 200
)

Example Response:

[
'success' => true,
'message' => 'Event system entry created successfully',
'data' => [
'id' => 1,
'name' => 'user.created',
'description' => 'Send welcome email',
'event' => 'App\\Events\\UserCreated',
'listener' => 'App\\Listeners\\SendWelcomeEmail',
'priority' => 10,
'status' => true,
'created_at' => '2024-01-01 12:00:00',
'updated_at' => '2024-01-01 12:00:00',
],
'code' => 201
]

Events

The service fires the following events:

EventSystemStoredEvent

Fired after successfully storing a new event system entry.

Payload:

  • $event (Event): The created event model
  • $data (array): The validated input data

EventSystemDeletingEvent

Fired before deleting an event system entry.

Payload:

  • $event (Event): The event model being deleted

EventSystemDeletedEvent

Fired after successfully deleting an event system entry.

Payload:

  • $event (Event): The deleted event model

Cache Management

The service automatically clears the cache after create, update, and delete operations:

cache()->forget('events');

Complete Examples

Register Multiple Events

use JobMetric\EventSystem\Facades\EventSystem;

$events = [
[
'name' => 'user.created',
'description' => 'Send welcome email',
'event' => App\Events\UserCreated::class,
'listener' => App\Listeners\SendWelcomeEmail::class,
'priority' => 10,
],
[
'name' => 'order.completed',
'description' => 'Send order confirmation',
'event' => App\Events\OrderCompleted::class,
'listener' => App\Listeners\SendOrderConfirmation::class,
'priority' => 5,
],
];

foreach ($events as $eventData) {
$response = EventSystem::store($eventData);

if (!$response->isSuccess()) {
Log::error('Failed to register event', [
'event' => $eventData['name'],
'errors' => $response->getErrors(),
]);
}
}

Admin Interface

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use JobMetric\EventSystem\Facades\EventSystem;
use Illuminate\Http\Request;

class EventSystemController extends Controller
{
public function index(Request $request)
{
$events = EventSystem::paginate(
filter: $request->only(['status', 'event', 'listener']),
page_limit: $request->get('per_page', 15)
);

return view('admin.events.index', compact('events'));
}

public function store(Request $request)
{
$response = EventSystem::store($request->all());

if ($response->isSuccess()) {
return redirect()->route('admin.events.index')
->with('success', $response->getMessage());
}

return back()->withErrors($response->getErrors());
}

public function toggleStatus(int $id)
{
$response = EventSystem::toggleStatus($id);

return response()->json($response->toArray());
}

public function destroy(string $name)
{
$response = EventSystem::delete($name);

if ($response->isSuccess()) {
return redirect()->route('admin.events.index')
->with('success', $response->getMessage());
}

return back()->withErrors($response->getErrors());
}
}

Plugin System

class EmailPlugin
{
public function install(): void
{
EventSystem::store([
'name' => 'plugin.email.user.created',
'event' => App\Events\UserCreated::class,
'listener' => EmailPlugin\Listeners\SendWelcomeEmail::class,
'priority' => 10,
'status' => true,
]);
}

public function uninstall(): void
{
EventSystem::delete('plugin.email.user.created');
}
}