Skip to main content

Domain Events

All Rolix domain events implement JobMetric\EventSystem\Contracts\DomainEvent and are registered on EventRegistry in RolixServiceProvider::afterBootPackage() when Event System is installed ($this->app->bound('EventRegistry')).

Titles and descriptions live under rolix::base.events.* (en/fa).

Quick Reference

Classkey()Fired when
RoleStoreEventrole.storedRole created
RoleUpdateEventrole.updatedRole updated
RoleDeleteEventrole.deletedRole deleted
MembershipStoreEventmembership.storedMembership created
MembershipUpdateEventmembership.updatedMembership updated
MembershipDeleteEventmembership.deletedMembership soft-deleted
MembershipRestoreEventmembership.restoredMembership restored
MembershipForceDeleteEventmembership.force_deletedMembership force-deleted
RegisterPathPermissionEventpermission.paths_registeringApp booted — collect permission file paths
PersonableResourceEventresource.personableResolving personable API resource
MemberableResourceEventresource.memberableResolving memberable API resource
ActorResourceEventresource.actorResolving activity-log actor resource
TargetResourceEventresource.targetResolving activity-log target resource
ContextResourceEventresource.contextResolving activity-log context resource
SubjectResourceEventresource.subjectResolving activity-log subject resource

CRUD events are wired through AbstractCrudService via $storeEventClass, $updateEventClass, $deleteEventClass, etc. on the Role / Membership services.


Role Events

RoleStoreEvent

Namespace: JobMetric\Rolix\Events\Role\RoleStoreEvent
Key: role.stored
Tags: role, storage, management

Constructor propTypeDescription
$roleRoleNewly stored role
$dataarrayStore payload (default [])

When fired: After a successful Role::store().

use Illuminate\Support\Facades\Event;
use JobMetric\Rolix\Events\Role\RoleStoreEvent;

Event::listen(RoleStoreEvent::class, function (RoleStoreEvent $event) {
logger()->info('Role stored', [
'id' => $event->role->id,
'name' => $event->role->name,
'data' => $event->data,
]);
});

RoleUpdateEvent

Namespace: JobMetric\Rolix\Events\Role\RoleUpdateEvent
Key: role.updated
Tags: role, storage, management

Constructor propTypeDescription
$roleRoleUpdated role
$dataarrayUpdate payload (default [])

When fired: After a successful Role::update().

Event::listen(RoleUpdateEvent::class, function (RoleUpdateEvent $event) {
cache()->forget("rolix.role.{$event->role->id}");
});

RoleDeleteEvent

Namespace: JobMetric\Rolix\Events\Role\RoleDeleteEvent
Key: role.deleted
Tags: role, storage, management

Constructor propTypeDescription
$roleRoleDeleted role instance

When fired: After a successful Role::destroy() (super roles are blocked before delete).

Event::listen(RoleDeleteEvent::class, function (RoleDeleteEvent $event) {
// $event->role still holds attributes after deletion from the service flow
});

Membership Events

MembershipStoreEvent

Namespace: JobMetric\Rolix\Events\Membership\MembershipStoreEvent
Key: membership.stored
Tags: membership, storage, management

Constructor propTypeDescription
$membershipMembershipCreated membership
$dataarrayStore payload (default [])

When fired: After Membership::store().

use JobMetric\Rolix\Events\Membership\MembershipStoreEvent;

Event::listen(MembershipStoreEvent::class, function (MembershipStoreEvent $event) {
notifyAdmins($event->membership);
});

MembershipUpdateEvent

Namespace: JobMetric\Rolix\Events\Membership\MembershipUpdateEvent
Key: membership.updated

Constructor propTypeDescription
$membershipMembershipUpdated membership
$dataarrayUpdate payload (default [])

When fired: After Membership::update().

MembershipDeleteEvent

Namespace: JobMetric\Rolix\Events\Membership\MembershipDeleteEvent
Key: membership.deleted

Constructor propTypeDescription
$membershipMembershipSoft-deleted membership

When fired: After soft delete (destroy).

MembershipRestoreEvent

Namespace: JobMetric\Rolix\Events\Membership\MembershipRestoreEvent
Key: membership.restored

Constructor propTypeDescription
$membershipMembershipRestored membership

When fired: After Membership::restore().

MembershipForceDeleteEvent

Namespace: JobMetric\Rolix\Events\Membership\MembershipForceDeleteEvent
Key: membership.force_deleted

Constructor propTypeDescription
$membershipMembershipPermanently deleted membership

When fired: After Membership::forceDelete().

use JobMetric\Rolix\Events\Membership\MembershipForceDeleteEvent;

Event::listen(MembershipForceDeleteEvent::class, function (MembershipForceDeleteEvent $event) {
audit()->note('membership purged', $event->membership->id);
});

Permission Paths

RegisterPathPermissionEvent

Namespace: JobMetric\Rolix\Events\RegisterPathPermissionEvent
Key: permission.paths_registering
Tags: permission, registration, management

Mutable collector (not a readonly CRUD event). Constructed with an empty path map, then listeners call addPath().

MethodSignatureDescription
addPath(string $context, string $path, ?string $model = null): voidRegister a permission PHP file; throws InvalidArgumentException on duplicate context+model
getPaths(): arrayFlat list of [context, path, model|null]

When fired: Once on app()->booted() in RolixServiceProvider, after loading config_path('permissions/*.php'). Returned paths are passed to Permission::addPermissionFile().

use JobMetric\Rolix\Events\RegisterPathPermissionEvent;
use App\Models\Tenant;

Event::listen(RegisterPathPermissionEvent::class, function (RegisterPathPermissionEvent $event) {
$event->addPath('hero', __DIR__.'/../permissions/hero.php');
$event->addPath('hero', __DIR__.'/../permissions/hero-tenant.php', Tenant::class);
});

null / empty $model maps to the system model key inside PermissionManager.


Resource Resolution Events

Mutable events used by model accessors to supply JsonResource (or array) payloads for morph relations. Listen and set $event->resource.

PersonableResourceEvent

Key: resource.personable
Props: $personable (mixed), $resource (mixed|null, set by listener)

When fired: Membership::getPersonableResourceAttribute().

use JobMetric\Rolix\Events\Resources\PersonableResourceEvent;
use App\Http\Resources\UserResource;

Event::listen(PersonableResourceEvent::class, function (PersonableResourceEvent $event) {
if ($event->personable instanceof \App\Models\User) {
$event->resource = UserResource::make($event->personable);
}
});

MemberableResourceEvent

Key: resource.memberable
Props: $memberable (mixed), $resource (mixed|null)

When fired: Membership::getMemberableResourceAttribute() when memberable morph keys are set.

ActorResourceEvent

Key: resource.actor
Props: $actor (mixed), $resource (mixed|null)

When fired: RoleActivityLog::getActorResourceAttribute().

TargetResourceEvent

Key: resource.target
Props: $target (mixed), $resource (mixed|null)

When fired: RoleActivityLog::getTargetResourceAttribute().

ContextResourceEvent

Key: resource.context
Props: $context (mixed), $resource (mixed|null)

When fired: RoleActivityLog::getContextResourceAttribute().

SubjectResourceEvent

Key: resource.subject
Props: $subject (mixed), $resource (mixed|null)

When fired: RoleActivityLog::getSubjectResourceAttribute().

use JobMetric\Rolix\Events\Resources\ActorResourceEvent;

Event::listen(ActorResourceEvent::class, function (ActorResourceEvent $event) {
if ($event->actor instanceof \App\Models\User) {
$event->resource = [
'id' => $event->actor->id,
'name' => $event->actor->name,
];
}
});

Listening Tips

  • Prefer Event::listen(SomeEvent::class, …) or dedicated listener classes.
  • Domain event key() values are stable for Event System UI / registry metadata.
  • Resource events start with $resource = null; leave unset if you do not handle that morph type.