Events & Observers
Introduction
JCC-Eloquent models fire lifecycle events during create, update, save, delete, and restore flows.
Available event hooks:
creating,createdsaving,savedupdating,updateddeleting,deletedrestoring,restored
Register events in boot or booted
Models can use static boot() / booted() to register listeners.
TypeScript
When events fire
Common flow:
Model.create(...):creating-> insert ->createdmodel.save()on existing model:saving->updating-> update ->updated->savedmodel.save()on new model:saving->creating-> insert ->created->savedmodel.delete():deleting-> delete/soft-delete ->deletedmodel.restore():restoring->restored->save()flow
Silencing events
Use these APIs to skip model events:
- instance level:
saveQuietly(),updateQuietly(...),deleteQuietly() - static callback wrapper:
Model.executeWithoutEvents(async () => { ... }) - builder level:
query().updateQuietly(...),query().deleteQuietly()
Observers
Observers let you move model event logic out of the model class into a dedicated observer class.
JCC-Eloquent provides the Observer(...) decorator for this.
Create an observer class
Observer methods match model lifecycle event names.
TypeScript
Supported observer method names:
creating,createdsaving,savedupdating,updateddeleting,deleted
Attach observer to a model
TypeScript
When the model boots, the observer is resolved and matching methods are registered.
Observer vs model booted()
Use either pattern based on preference:
- keep small, model-specific hooks in
booted() - use observers when hooks grow or you want cleaner separation
Both run through the same lifecycle events.
Boot lifecycle notes
boot()andbooted()are called once per model class when events boot- listener registration helpers are available as static methods (
creating(...),updated(...), etc.)
This keeps event registration centralized in your model class.
