Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
- Host: GitHub
- URL: https://github.com/jpkleemans/attribute-events
- Owner: jpkleemans
- License: mit
- Created: 2019-12-16T16:10:48.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2024-11-06T16:15:27.000Z (3 months ago)
- Last Synced: 2025-01-13T10:00:17.232Z (9 days ago)
- Topics: accessors, attributes, ddd, domain-driven-design, domain-events, domain-model, eloquent, event-driven-architecture, event-storming, events, laravel, model-events
- Language: PHP
- Homepage: https://attribute.events
- Size: 382 KB
- Stars: 314
- Watchers: 6
- Forks: 21
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
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)```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
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).