> ## Documentation Index
> Fetch the complete documentation index at: https://docs.unleash-commerce.eu/llms.txt
> Use this file to discover all available pages before exploring further.

# Observers

> Use observers to extend model behavior in Unleash Commerce Core

## Overview

Unleash Commerce uses observers to provide behavior that should always happen to models. For example, the `UserObserver` automatically removes roles and permissions when a user is deleted, ensuring data consistency without requiring manual cleanup.

## Creating an Observer

Create an observer class and implement the observer contract for your model:

```php theme={null}
namespace App\Observers;

use Esign\UnleashCommerce\Core\Contracts\Observers\CategoryObserver as CategoryObserverContract;
use Esign\UnleashCommerce\Core\Models\Category;
use Illuminate\Support\Facades\Cache;

class CategoryObserver implements CategoryObserverContract
{
    public function updated(Category $category): void
    {
        // Invalidate category cache when updated
        Cache::forget('categories_tree');
    }

    public function deleted(Category $category): void
    {
        // Invalidate category cache when deleted
        Cache::forget('categories_tree');
    }
}
```

## Replacing an Observer

Replace a default observer with your custom implementation in a service provider:

```php theme={null}
<?php

namespace App\Providers;

use App\Observers\UserObserver;
use Esign\UnleashCommerce\Core\Contracts\Observers\UserObserver as UserObserverContract;
use Esign\UnleashCommerce\Core\Facades\ObserverManifest;
use Illuminate\Support\ServiceProvider;

class UnleashCommerceServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        $this->registerObservers();
    }

    protected function registerObservers(): void
    {
        ObserverManifest::replace(
            UserObserverContract::class,
            UserObserver::class
        );
    }
}
```

## Disabling an Observer

Disable an observer entirely without replacing it in a service provider:

```php theme={null}
<?php

namespace App\Providers;

use Esign\UnleashCommerce\Core\Contracts\Observers\CategoryObserver as CategoryObserverContract;
use Esign\UnleashCommerce\Core\Facades\ObserverManifest;
use Illuminate\Support\ServiceProvider;

class UnleashCommerceServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        $this->registerObservers();
    }

    protected function registerObservers(): void
    {
        ObserverManifest::disable(CategoryObserverContract::class);
    }
}
```

## Existing Observers

The core package includes the following observers:

| Observer           | Contract                   | Purpose                                                                      |
| ------------------ | -------------------------- | ---------------------------------------------------------------------------- |
| `CategoryObserver` | `CategoryObserverContract` | Handles category deletion, including nested categories.                      |
| `UserObserver`     | `UserObserverContract`     | Manages user deletion by cleaning up associated customer user relationships. |
