# Working with "granular cache"

ScandiPWA controls cache in a different way than [default Magento 2](https://devdocs.magento.com/guides/v2.3/graphql/develop/create-graphqls-file.html#query-caching) does. We are still using the caching identities, but, instead of specifying them on GraphQL queries, we use events.

## General rule

To make some of your model work as cache identity manager:

1. Make sure it implements the `Magento\Framework\DataObject\IdentityInterface`

```php
use Magento\Framework\DataObject\IdentityInterface;
use Magento\Framework\Model\AbstractModel;

class Slide extends AbstractModel implements IdentityInterface {
    public function getIdentities() {
        // TODO: implement
    }
}
```

2\. Specify the caching tag constant, it should be short and unique:

```php
class Slide extends AbstractModel implements IdentityInterface {
    const CACHE_TAG = 'sw_sld';

    protected $_cacheTag = self::CACHE_TAG;
}
```

3\. Implement the `getIdentities` method, specify all involved cache identities. In our example, on slide save, the slider model should also be invalidate:

```php
class Slide extends AbstractModel implements IdentityInterface {
    const CACHE_TAG = 'sw_sld';

    public function getIdentities() {
        return [
            self::CACHE_TAG . '_' . $this->getId(),
            Slider::CACHE_TAG . '_' . $this->getSliderId()
        ];
    }
}
```

4\. Add the names for events, prefer unique, descriptive names:

```php
class Slide extends AbstractModel implements IdentityInterface {
    protected $_eventPrefix = 'scandiweb_slider_slide';
}
```

5\. In case you have a resource model, i.e. the `Collection`, add the event after collection save:

```php
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

class Collection extends AbstractCollection {
    protected function _afterLoadData() {
        parent::_afterLoadData();

        $collection = clone $this;

        if (count($collection)) {
            $this->_eventManager->dispatch(
                'scandiweb_slider_slider_collection_load_after',
                ['collection' => $collection]
            );
        }

        return $this;
    }
}
```

6\. It is finally time to connect the events, to granular cache management classes. Create, or modify the `etc/events.xml` with the following content:

```php
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="scandiweb_slider_slider_collection_load_after">
        <observer name="pq_cc_slider" instance="ScandiPWA\Cache\Observer\Response\TagEntityResponse"/>
    </event>
    <event name="scandiweb_slider_slider_save_after">
        <observer name="pq_cc_slider" instance="ScandiPWA\Cache\Observer\FlushVarnishObserver"/>
    </event>
    <event name="scandiweb_slider_slide_collection_load_after">
        <observer name="pq_cc_slide" instance="ScandiPWA\Cache\Observer\Response\TagEntityResponse"/>
    </event>
    <event name="scandiweb_slider_slide_save_after">
        <observer name="pq_cc_slide" instance="ScandiPWA\Cache\Observer\FlushVarnishObserver"/>
    </event>
</config>
```

Note, there are two classes used as observers:

* `ScandiPWA\Cache\Observer\FlushVarnishObserver` - responsible for flushing, must be triggered on save of the model.
* `ScandiPWA\Cache\Observer\Response\TagEntityResponse` - responsible for tagging, must be triggered after load of the collection/model.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.scandipwa.com/developing-with-scandi/working-with-magento/working-with-granular-cache.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
