Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jpkleemans/attribute-events

🔥 Fire events on attribute changes of your Eloquent model
https://github.com/jpkleemans/attribute-events

accessors attributes ddd domain-driven-design domain-events domain-model eloquent event-driven-architecture event-storming events laravel model-events

Last synced: 1 day ago
JSON representation

🔥 Fire events on attribute changes of your Eloquent model

Awesome Lists containing this project

README

        

![Laravel Attribute Events](/../gh-pages/attribute-events.svg#gh-light-mode-only)
![Laravel Attribute Events](/../gh-pages/attribute-events-dark.svg#gh-dark-mode-only)


Build Status
Last Updated
Latest Stable Version
License

```php
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
```bash
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:

```php
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:

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

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

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

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

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

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

```php
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](https://laravel.com/docs/9.x/releases#eloquent-accessors-and-mutators) introduced in Laravel 9.

## Learn more
- [“Decouple your Laravel code using Attribute Events”](https://jpkleemans.medium.com/decouple-your-laravel-code-using-attribute-events-de8f2528f46a) by Jan-Paul Kleemans
- [Laravel Docs on Model Events](https://laravel.com/docs/eloquent#events)

## Sponsors


Nexxtmove Logo

Thanks to Nexxtmove for sponsoring the development of this project.
Your logo or name here? [Sponsor this project](https://github.com/sponsors/jpkleemans).

## License

Code released under the [MIT License](https://github.com/jpkleemans/attribute-events/blob/master/LICENSE).