Back to Documentation
API Reference
⚙️Observers API Reference
Observers hook into model lifecycle events — `creating`, `created`, `updating`, `updated`, `saving`, `saved`, `deleting`, `deleted`, `forceDeleting`, `forceDele
Overview#
Observers hook into model lifecycle events — creating, created, updating, updated, saving, saved, deleting, deleted, forceDeleting, forceDeleted.
php
use Siro\Core\Observers\ModelObserver;
Define Observer#
php
<?php
declare(strict_types=1);
namespace App\Observers;
use Siro\Core\Observers\ModelObserver;
use Siro\Core\Model;
class ProductObserver extends ModelObserver
{
public function creating(Model $model): void
{
// Auto-set slug before creation
$model->setAttribute('slug', Str::slug($model->getAttribute('name')));
}
public function created(Model $model): void
{
// Log after creation
Logger::info('Product created', ['id' => $model->id, 'name' => $model->name]);
}
public function updating(Model $model): void
{
// Prevent price drops below cost
if ($model->getAttribute('price') < 10) {
throw new \RuntimeException('Price too low');
}
}
public function deleted(Model $model): void
{
// Cleanup related data
Storage::delete('products/' . $model->id . '.jpg');
}
}
Register Observer#
php
// In routes/api.php or AppServiceProvider
use App\Models\Product;
use App\Observers\ProductObserver;
Product::observe(ProductObserver::class);
Available Hooks (10)#
php
class MyObserver extends ModelObserver
{
// Called in order:
public function saving(Model $model): void {} // Before any save
public function creating(Model $model): void {} // Before insert
public function created(Model $model): void {} // After insert
public function saved(Model $model): void {} // After any save
public function updating(Model $model): void {} // Before update
public function updated(Model $model): void {} // After update
public function deleting(Model $model): void {} // Before delete
public function deleted(Model $model): void {} // After delete
public function forceDeleting(Model $model): void {} // Before force delete
public function forceDeleted(Model $model): void {} // After force delete
}
Use Cases#
php
// Before save — auto-fill fields
public function saving(Model $model): void
{
if ($model->getAttribute('slug') === null) {
$model->setAttribute('slug', Str::slug($model->getAttribute('title')));
}
}
// Before delete — check constraints
public function deleting(Model $model): void
{
if ($model->orders()->count() > 0) {
throw new \RuntimeException('Cannot delete product with orders');
}
}
// After create — trigger side effects
public function created(Model $model): void
{
Event::dispatch('product.created', ['id' => $model->id]);
Queue::push(new ProcessProductImages($model->id));
}