jpkleemans/attribute-events

πŸ”₯ Fire events on attribute changes of your Eloquent model

Maintainers

πŸ‘ jpkleemans

Package info

github.com/jpkleemans/attribute-events

Homepage

pkg:composer/jpkleemans/attribute-events

Fund package maintenance!

jpkleemans

Statistics

Installs: 532 917

Dependents: 1

Suggesters: 0

Stars: 332

Open Issues: 2

1.5.1 2025-05-16 10:21 UTC

Requires

  • php: ^7.3|^8.0

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT e3fe3af55d61c88ec25702f27b1a4f3421d12e2a

  • Jan-Paul Kleemans <jpkleemans.woop@gmail.com>

eventsattributeslaraveldddeloquentdomain eventsmodel events

This package is auto-updated.

Last update: 2026-06-05 15:17:30 UTC


README

πŸ‘ Laravel Attribute Events
πŸ‘ Laravel Attribute Events

πŸ‘ Build Status
πŸ‘ Last Updated
πŸ‘ Latest Stable Version
πŸ‘ License

class Order extends Model
{
 protected $dispatchesEvents = [
 'status:shipped' => OrderShipped::class,
 'note:*' => OrderNoteChanged::class,
 ];
}

Eloquent models fire several handy events throughout their lifecycle, like created and deleted. However, there are usually many more business meaningful events that happen during a model's life. With this library you can capture those, by mapping attribute changes to your own event classes.

Installation

composer require jpkleemans/attribute-events

How to use it

Use the Kleemans\AttributeEvents trait in your model and add the attributes to the $dispatchesEvents property:

class Order extends Model
{
 use AttributeEvents;

 protected $dispatchesEvents = [
 'created' => OrderPlaced::class,
 'status:canceled' => OrderCanceled::class,
 'note:*' => OrderNoteChanged::class,
 ];
}

The attribute events will be dispatched after the updated model is saved. Each event receives the instance of the model through its constructor.

For more info on model events and the $dispatchesEvents property, visit the Laravel Docs

Listening

Now you can subscribe to the events via the EventServiceProvider $listen array, or manually with Closure based listeners:

Event::listen(function (OrderCanceled $event) {
 // Restock inventory
});

Or push realtime updates to your users, using Laravel's broadcasting feature:

Echo.channel('orders')
 .listen('OrderShipped', (event) => {
 // Display a notification
 })

JSON attributes

For attributes stored as JSON, you can use the -> operator:

protected $dispatchesEvents = [
 'payment->status:completed' => PaymentCompleted::class,
];

Accessors

For more complex state changes, you can use attributes defined by an accessor:

class Product extends Model
{
 protected $dispatchesEvents = [
 'low_stock:true' => ProductReachedLowStock::class,
 ];

 public function getLowStockAttribute(): bool
 {
 return $this->stock <= 3;
 }
}

You can also use the new way of defining accessors introduced in Laravel 9.

Learn more

Sponsors

πŸ‘ Nexxtmove Logo

Thanks to Nexxtmove for sponsoring the development of this project.
Your logo or name here? Sponsor this project.

License

Code released under the MIT License.