JCC Express

Events & Observers

Introduction

JCC-Eloquent models fire lifecycle events during create, update, save, delete, and restore flows.

Available event hooks:

  • creating, created
  • saving, saved
  • updating, updated
  • deleting, deleted
  • restoring, 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 -> created
  • model.save() on existing model: saving -> updating -> update -> updated -> saved
  • model.save() on new model: saving -> creating -> insert -> created -> saved
  • model.delete(): deleting -> delete/soft-delete -> deleted
  • model.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, created
  • saving, saved
  • updating, updated
  • deleting, 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() and booted() 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.